hibernate - при обновлении NonUniqueObjectException с пессимистической блокировкой «upgrade» - PullRequest
0 голосов
/ 22 февраля 2011

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();
    }

1 Ответ

3 голосов
/ 22 февраля 2011

saveOrUpdate берет отдельный экземпляр (newRateCodeRange) и пытается присоединить его к сеансу. В документации сказано, что генерируется исключение (которое вы встречаете), если другой экземпляр того же объекта с тем же идентификатором уже связан с сеансом, что имеет место в данном случае (existingRateCode).

Вероятно, вам следует использовать метод merge, чтобы скопировать состояние отсоединенного экземпляра в присоединенный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...