Project

General

Profile

« Previous | Next » 

Revision 5261131c

Added by Andreas Kohlbecker about 5 years ago

ref #8132 proper transaction rollback in CdmStore - copied from hfx branch

View differences:

src/main/java/eu/etaxonomy/cdm/service/CdmStore.java
64 64
     */
65 65
    public <T extends CdmBase> T mergedBean(T bean) throws IllegalStateException {
66 66

  
67
        TransactionStatus txStatus = repo.startTransaction();
68
        Session session = repo.getSession();
69

  
70
        if (session.contains(bean)) {
71
            // evict bean before merge to avoid duplicate beans in same session
72
            logger.trace(this._toString() + ".mergedBean() - evict " + bean.toString());
73
            session.evict(bean);
67
        try{
68
            TransactionStatus txStatus = repo.startTransaction();
69
            Session session = repo.getSession();
70
            try {
71
                if (session.contains(bean)) {
72
                    // evict bean before merge to avoid duplicate beans in same session
73
                    logger.trace(this._toString() + ".mergedBean() - evict " + bean.toString());
74
                    session.evict(bean);
75
                }
76
                logger.trace(this._toString() + ".mergedBean() - doing merge of" + bean.toString());
77
                @SuppressWarnings("unchecked")
78
                T mergedBean = (T) session.merge(bean);
79
                session.flush();
80
                repo.commitTransaction(txStatus);
81
                logger.trace(this._toString() + ".mergedBean() - bean after merge " + bean.toString());
82
                return mergedBean;
83
            } catch(Exception e){
84
                repo.getTransactionManager().rollback(txStatus);
85
                throw e;
86
            }
87
        } finally {
88
            repo.clearSession(); // #7559
74 89
        }
75

  
76
        logger.trace(this._toString() + ".mergedBean() - doing merge of" + bean.toString());
77
        @SuppressWarnings("unchecked")
78
        T mergedBean = (T) session.merge(bean);
79
        session.flush();
80
        repo.commitTransaction(txStatus);
81
        logger.trace(this._toString() + ".mergedBean() - bean after merge " + bean.toString());
82
        return mergedBean;
83

  
84 90
    }
85 91

  
86 92

  
......
103 109
        } else {
104 110
            changeEventType = Type.CREATED;
105 111
        }
106

  
107
        TransactionStatus txStatus = repo.startTransaction();
108
        Session session = repo.getSession();
109
        logger.trace(this._toString() + ".onEditorSaveEvent - merging bean into session");
110
        // merge the changes into the session, ...
111
        T mergedBean = mergedBean(bean);
112
        session.flush();
113
        repo.commitTransaction(txStatus);
114
        return new EntityChangeEvent(mergedBean, changeEventType, view);
112
        
113
        try{
114
            TransactionStatus txStatus = repo.startTransaction();
115
            Session session = repo.getSession();
116
            try {
117
                logger.trace(this._toString() + ".onEditorSaveEvent - merging bean into session");
118
                // merge the changes into the session, ...
119
                T mergedBean = mergedBean(bean);
120
                session.flush();
121
                repo.commitTransaction(txStatus);
122
                return new EntityChangeEvent(mergedBean, changeEventType, view);
123
            } catch(Exception e){
124
                repo.getTransactionManager().rollback(txStatus);
125
                throw e;
126
            }
127
        } finally {
128
            repo.clearSession(); // #7559
129
        }
115 130

  
116 131
    }
117 132

  
......
124 139

  
125 140
        IService<T> typeSpecificService = serviceFor(bean);
126 141

  
127
        logger.trace(this._toString() + ".onEditorPreSaveEvent - starting transaction");
128
        TransactionStatus txStatus = repo.startTransaction();
129
        Session session = repo.getSession();
130
        logger.trace(this._toString() + ".deleteBean - deleting" + bean.toString());
131
        DeleteResult result = typeSpecificService.delete(bean);
132
        if (result.isOk()) {
133
            session.flush();
134
            repo.commitTransaction(txStatus);
135
            logger.trace(this._toString() + ".deleteBean - transaction comitted");
136
            return new EntityChangeEvent(bean, Type.REMOVED, view);
137
        } else {
138
            handleDeleteresultInError(result);
142
        try{
143
            Session session = repo.getSession();     
144
            logger.trace(this._toString() + ".deleteBean - deleting" + bean.toString());
145
            DeleteResult result = typeSpecificService.delete(bean);
146
            if (result.isOk()) {
147
                session.flush();
148
                return new EntityChangeEvent(bean, Type.REMOVED, view);
149
            } else {
150
                handleDeleteresultInError(result);
151
            }
152
        } finally {
153
            repo.clearSession(); // #7559
139 154
        }
140 155

  
141 156
        return null;

Also available in: Unified diff