HibernateException для session.buildLockRequest с байтом [] в качестве первичного ключа - PullRequest
1 голос
/ 15 марта 2012

У меня есть пользователь и объект credit_card, у пользователя есть коллекция credit_card. Первичный ключ для обеих этих сущностей, которые у меня есть, - это байт [].

Первый сеанс: - Я открыл новую сессию. - Выполните запрос критериев в таблице пользователей, которая на самом деле идет в БД и выбирает user + credit_cards, и, наконец, у меня есть пользовательский объект, скажем userObj. - Закройте сеанс.

Второй сеанс: - Я открыл еще одну сессию. - попытка вызвать session.buildLockRequest (LockOptions.NONE) .lock (userObj);

Теперь hibernate попытается присоединить отсоединенный объект, но я получаю следующую ошибку:

org.hibernate.HibernateException: reassociated object has dirty collection reference
at org.hibernate.event.def.OnLockVisitor.processCollection(OnLockVisitor.java:71)
at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:122)
at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:83)
at org.hibernate.event.def.AbstractVisitor.processEntityPropertyValues(AbstractVisitor.java:77)
at org.hibernate.event.def.AbstractVisitor.process(AbstractVisitor.java:144)
at org.hibernate.event.def.AbstractReassociateEventListener.reassociate(AbstractReassociateEve    ntListener.java:101)
at   org.hibernate.event.def.DefaultLockEventListener.onLock(DefaultLockEventListener.java:82)
at org.hibernate.impl.SessionImpl.fireLock(SessionImpl.java:774)
at org.hibernate.impl.SessionImpl.fireLock(SessionImpl.java:766)
at org.hibernate.impl.SessionImpl.access$600(SessionImpl.java:156)

Я попытался отладить его в коде hibernate и обнаружил, что hibernate пытается проверить, действительно ли коллекция переданного объекта (credit_cards) принадлежит пользователю (который является user1).

Так что где-то глубоко внутри кода в hibernate, похоже, что он проверяет равенство с , равным методу первичных ключей переданного объекта (который является user1) и другого объекта, который он вызывает объект снимка. Поскольку byte [], по сути, является массивом и завершается неудачно при проверке на равные и выдает вышеуказанную ошибку Я знаю, что могу выполнить вышеуказанную работу всего за один сеанс, но это всего лишь сценарий.

Я попытался использовать Long / Integer в качестве первичного ключа, и он прекрасно работает, так как он проходит проверку на равенство.

Hibernate версия: 3.6.9.Final (я попытался взглянуть и на версию 4.1.1.Final, но файлы / код, которые выдают эту ошибку, не изменились) БД: SQL сервер

Это проблема в спящем режиме или я делаю что-то не так?

Ответы [ 2 ]

1 голос
/ 15 марта 2012

Это не проблема в Hibernate.Класс идентификатора должен реализовывать hashCode и равен равно.byte[] нет, так что это недопустимый класс ID.Использование байта [] в качестве идентификатора, IMO, действительно плохая идея.Лонг - действительно лучшая идея.Если вы действительно хотите сохранить свой байтовый массив, оберните его в пользовательский тип или преобразуйте в String с использованием кодировки Base64 или Hex.

1 голос
/ 15 марта 2012

использовать строку вместо байта [] в качестве первичного ключа. он может нести то же значение и пройдет метод равно

String myId = new String(bytes);

myId.getBytes();

это не спящий вопрос.

...