У меня есть список объектов. Это объекты JPA «Местоположение».JPA с JTA, как сохранить много entites в одной транзакции
List<Location> locations;
У меня есть безгосударственный EJB, который проходит через список и сохраняется каждый.
public void createLocations() {
List<Locations> locations = getListOfJPAManagedLocationEntities(); // I'm leaving out the details of this because it has nothing to do with the issue
for(Location location : locations) {
em.persist(location);
}
}
Код работает нормально. У меня нет никаких проблем. Однако проблема заключается в следующем: я хочу, чтобы это была транзакция «все или ничего». В настоящее время каждый раз через цикл for метод persist() будет вставлять новую строку в базу данных. Предположим, у меня есть 100 объектов местоположения, а у 54-го объекта что-то не так с ним, и возникает исключение. В базу данных будет включено 53 записи. Я хочу: все они должны преуспеть, прежде чем кто-то из них преуспеет.
Я пользуюсь последней версией & самой большой версии Java EE6, EJB 3.x. и JPA 2. В моем persistence.xml используется JTA.
<persistence-unit name="myPersistenceUnit" transaction-type="JTA">
И мне нравится иметь JTA. Я не хочу останавливать использование JTA. 90% времени JTA делает именно то, что я хочу, чтобы он делал. Но в этом случае я не вижу.
Мое понимание JTA должно быть неточным, потому что я всегда думал, что начало и конец метода EJB обозначают границы транзакции JTA (предположим, что только один метод включен, как я показал выше). По моей логике транзакция не закончилась до тех пор, пока цикл for не будет выполнен, и метод вернется, а затем в этот момент записи сохраняются.
Я использую драйвер JTDS для SqlServer 2008. Возможно, база данных не хочет вставлять запись, не совершая ее немедленно. Идентификатор объекта определяется следующим образом:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Я проверил спецификации, и это не свойственно вызывать различные «UserTransaction» или «getTransaction()» методы в среде JTA..
Так что я могу сделать? Спасибо.
Итак, в чем проблема? Что произойдет, если 54-я запись приведет к выбросу исключения? Вы сделали тест? Ваши предположения верны: в случае исключения времени выполнения вы будете иметь откат. –
Думаю, я не был достаточно ясен в своем первоначальном вопросе. Я уже тестировал это; снова и снова. Если 54-я запись не удалась, предыдущие 53 записи по-прежнему вставляются в базу данных. Это проблема, потому что я не хочу, чтобы эти 53 записи были вставлены в базу данных. –
Какова 54-я запись? Вызывает ли это исключение? Который из? –