Revision 98db0610
Added by Andreas Kohlbecker about 5 years ago
src/main/java/eu/etaxonomy/cdm/service/CdmStore.java | ||
---|---|---|
52 | 52 |
@Qualifier("cdmRepository") |
53 | 53 |
private CdmRepository repo; |
54 | 54 |
|
55 |
|
|
56 |
/** |
|
57 |
* If the bean is contained in the session it is being updated by doing an |
|
58 |
* evict and merge. The fieldGroup is updated with the merged bean. |
|
59 |
* |
|
60 |
* |
|
61 |
* @param bean |
|
62 |
* @return The bean merged to the session or original bean in case a merge |
|
63 |
* was not necessary. |
|
64 |
*/ |
|
65 |
public <T extends CdmBase> T mergedBean(T bean) throws IllegalStateException { |
|
66 |
|
|
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 |
|
89 |
} |
|
90 |
} |
|
91 |
|
|
92 |
|
|
93 | 55 |
protected String _toString() { |
94 | 56 |
return this.getClass().getSimpleName() + "@" + this.hashCode(); |
95 | 57 |
} |
... | ... | |
109 | 71 |
} else { |
110 | 72 |
changeEventType = Type.CREATED; |
111 | 73 |
} |
112 |
|
|
74 |
|
|
113 | 75 |
try{ |
114 | 76 |
TransactionStatus txStatus = repo.startTransaction(); |
115 | 77 |
Session session = repo.getSession(); |
116 | 78 |
try { |
117 | 79 |
logger.trace(this._toString() + ".onEditorSaveEvent - merging bean into session"); |
118 | 80 |
// merge the changes into the session, ... |
119 |
T mergedBean = mergedBean(bean); |
|
120 |
session.flush(); |
|
81 |
if (session.contains(bean)) { |
|
82 |
// evict bean before merge to avoid duplicate beans in same session |
|
83 |
logger.trace(this._toString() + ".mergedBean() - evict " + bean.toString()); |
|
84 |
session.evict(bean); |
|
85 |
} |
|
86 |
logger.trace(this._toString() + ".mergedBean() - doing merge of" + bean.toString()); |
|
87 |
@SuppressWarnings("unchecked") |
|
88 |
T mergedBean = (T) session.merge(bean); |
|
121 | 89 |
repo.commitTransaction(txStatus); |
122 | 90 |
return new EntityChangeEvent(mergedBean, changeEventType, view); |
123 | 91 |
} catch(Exception e){ |
124 |
repo.getTransactionManager().rollback(txStatus);
|
|
92 |
transactionRollbackIfNotCompleted(txStatus);
|
|
125 | 93 |
throw e; |
126 | 94 |
} |
127 | 95 |
} finally { |
... | ... | |
130 | 98 |
|
131 | 99 |
} |
132 | 100 |
|
101 |
|
|
102 |
/** |
|
103 |
* @param txStatus |
|
104 |
*/ |
|
105 |
public void transactionRollbackIfNotCompleted(TransactionStatus txStatus) { |
|
106 |
if(!txStatus.isCompleted()){ |
|
107 |
repo.getTransactionManager().rollback(txStatus); |
|
108 |
} |
|
109 |
} |
|
110 |
|
|
133 | 111 |
/** |
134 | 112 |
* |
135 | 113 |
* @param bean |
... | ... | |
140 | 118 |
IService<T> typeSpecificService = serviceFor(bean); |
141 | 119 |
|
142 | 120 |
try{ |
143 |
Session session = repo.getSession();
|
|
121 |
Session session = repo.getSession(); |
|
144 | 122 |
logger.trace(this._toString() + ".deleteBean - deleting" + bean.toString()); |
145 | 123 |
DeleteResult result = typeSpecificService.delete(bean); |
146 | 124 |
if (result.isOk()) { |
Also available in: Unified diff
ref #8132 fixin bug related to transaction rollback in CdmStore