Hibernate и EclipseLink противоречивое поведение - PullRequest
2 голосов
/ 22 ноября 2010

Следующий (упрощенная версия нашего) кода проходит наши тесты JUnit в Hibernate, но не в EclipseLink.Что нужно, чтобы эта работа работала в EclipseLink?

public static void store(EntityManager em, String a, String b) {
    Entry entry=new Entry();
    entry.setFirst(a);
    entry.setLast(b);
    em.persist(entry);
    em.persist(new SubEntry(entry.getId(), a, b));
}

Сбой, потому что entry.getId () возвращает 0 при использовании EclipseLink.Как правильно извлечь уникальный идентификатор объекта, который только что был сохранен?

Кажется очевидным, что приведенный выше код не имеет смысла, как, например, запись entry.getId () до выполнения транзакции.совершено, вероятно, не имеет смысла, однако спящий режим позволил это.

1 Ответ

2 голосов
/ 22 ноября 2010

Здесь происходит несколько вещей.Если вы не предоставите часть кода для ваших классов сущностей, мы не сможем узнать, какую стратегию вы используете для генерации первичного ключа.Позвольте мне предположить, что вы используете стратегию, которая позволяет базе данных генерировать первичный ключ для вашего класса Entry, такой как последовательность или столбец автоматического номера.Позвольте мне далее предположить, что вы вызываете этот метод внутри активной транзакции.Если вы вставите вызов на em.flush() сразу после вашего звонка на em.persist(entry), то я думаю, что это сработает, учитывая предположения, которые я изложил выше.

Неизвестно, вижу ли я entryявляется ссылкой на управляемый объект, когда вы выполняете второй вызов em.persist(), и было ли ему еще присвоено значение идентификатора (первичного ключа).

...