hibernate 3.6.0 final
Я использовал pessimistic-lock
LockOptions - потому что LockMode не работает, т. Е. "Select ... for update" "for update" не генерируется вsql вот почему.
в session.saveOrUpdate
ОШИБКА:
org.hibernate.NonUniqueObjectException: другой объект с таким же значением идентификатора уже был связан с сеансом: [com.hermes.data.RateCode # RateCodeId {roomId = 6836date = 2011-02-01}
RateCode.hbm.xml
<class catalog="hermes" name="com.hermes.data.RateCode" table="ratecodes">
<composite-id class="com.hermes.data.RateCodeId" name="id">
<key-property name="roomId" type="int">
<column name="roomId"/>
</key-property>
<key-property name="date" type="date">
<column length="10" name="date" />
</key-property>
</composite-id>
код Java
for (int i = 0; i < roomId.length; i++) {
existingRateCodeList = getRateCodeRoom(session, Integer.parseInt(roomId[i]), newRateCodeRange.getStartDate(), newRateCodeRange.getEndDate(), true, LockOptions.UPGRADE);
updateRecord = existingRateCodeList.size();
remainingRecord = totleRecord - updateRecord;
if (existingRateCodeList.size() > 0) {
//update
updateOccured = true;
it = existingRateCodeList.iterator();
while (it.hasNext()) {
existingRateCode = (RateCode) it.next();
updatedRecordList.add(existingRateCode.getId());
newRateCodeRange.setId(existingRateCode.getId());
session.saveOrUpdate(newRateCodeRange);
session.flush();
session.clear();
}
tx.commit();
}
................ получение списка с тем же сеансом и / или другим сеансом.
со слиянием
ОШИБКА: org.hibernate.StaleObjectStateException: строка была обновлена или удалена другой транзакцией (или сопоставление несохраненного значения было неправильным): [com.hermes.data.RateCode # RateCodeId {roomId = 6836date = 2011-02-01}
public List<RateCode> getRateCodeRoom(Session session, int roomId, Date from, Date to, boolean refreshCache, LockOptions lockOptions) {
Query q = session.createQuery(
"from RateCode rr where rr.id.roomId=:roomId and rr.id.date>=:from and rr.id.date<=:to order by rr.id.date").setInteger("roomId", roomId).setParameter("from", from).setParameter("to", to).setCacheable(true).setCacheMode(refreshCache ? CacheMode.REFRESH : CacheMode.NORMAL);
if (lockOptions != null) {
q.setLockOptions(lockOptions);
}
return q.list();
}