Почему автоматическое принятие EclipseLink не работает с MySQL? - PullRequest
2 голосов
/ 22 июля 2011

Используя следующий код:

EntityManager manager = factory.createEntityManager();
manager.setFlushMode(FlushModeType.AUTO);
PhysicalCard card = new PhysicalCard();
card.setIdentifier("012345ABCDEF");
card.setStatus(CardStatusEnum.Assigned);

manager.persist(card);
manager.close();

при выполнении кода в этой строке запись «карточка» не появляется в базе данных. Однако если вы используете FlushModeType.COMMIT и используете транзакцию, подобную этой:

EntityManager manager = factory.createEntityManager();
manager.setFlushMode(FlushModeType.COMMIT);

manager.getTransaction().begin();
PhysicalCard card = new PhysicalCard();
card.setIdentifier("012345ABCDEF");
card.setStatus(CardStatusEnum.Assigned);

manager.persist(card);
manager.getTransaction().commit();

manager.close();

работает нормально. Из журнала eclipselink я вижу, что предыдущий код не выдает инструкцию INSERT, в то время как второй код делает.

Я что-то здесь пропускаю? Я использую EclipseLink 2.3 и MySQL соединение / J 5.1

1 Ответ

3 голосов
/ 23 июля 2011

Я предполагаю, что вы используете EclipseLink в приложении Java SE или в приложении Java EE, но с управляемым приложением EntityManager вместо управляемого контейнером EntityManager.

В обоих сценариях все обновления, сделанные в контексте постоянства, сбрасываются, только когда транзакция, связанная с фиксацией EntityManager (с использованием EntityTransaction.commit), или когда сбрасывается контекст постоянства EntityManager (с использованием * 1006) *EntityManager.flush). По этой причине второй фрагмент кода выдает INSERT, так как он вызывает методы EntityTransaction begin и commit, а первый - нет; вызов em.persist не выдает INSERT.

Что касается FlushModeType значений, документация API гласит следующее:

COMMIT

public static final FlushModeType COMMIT

Сброс происходит при фиксации транзакции. Поставщик может смывать на в других случаях, но не обязательно.


AUTO

публичный статический финал FlushModeType AUTO

(по умолчанию) Сброс происходит при выполнении запроса.

Поскольку в первом случае запросы не выполнялись, сбрасывание не выполняется, т. Е. Операторы INSERT, соответствующие постоянству сущности PhysicalCard, не будут выдаваться. Это явная фиксация EntityTransaction во втором, что приводит к выполнению оператора INSERT.

...