Что такое передовая практика Hibernate, когда приходится откатывать отношения с внешним ключом, но не хочет выкидывать транзакцию (т. Е. Продолжать с сохранением других данных)?Откат внешних отношений с Hibernate
Если я просто передаю исключение обратно в стек или не выполняю этот откат, тогда я удалю ошибку, когда попытаюсь сохранить другие данные (нулевой или переходный объект передан для сохранения), так как BookingLines уже сохранялся.
я в настоящее время обработки отката путем добавления новых объектов на карту, а затем удалить их из списка сущностей в случае неудачи следующим образом:
/* Method that will try to create an invoice but won't roll back the transaction if
* a currency rate can't be found.
*/
public void createInvoiceFromBooking(Booking booking) {
Invoice invoice = new Invoice();
//Map to hold entities that I want to roll back
Map<BookingLine, InvoiceLine> addedLines = new HashMap<BookingLine, InvoiceLine>();
try {
for(BookingLine bookingLine : booking.getBookingLines()) {
InvoiceLIne invoiceLIne = new InvoiceLIne();
//do stuff that can throw exception
applyCurrencyRate(invoiceLine);
bookingLine.getInvoiceLines().add(invoiceLine);
invoice.getInvoiceLines().add(invoiceLine);
//add to the "rollback" map
addedLines.put(bookingLine, invoiceLine);
}
} catch (Exception e) {
//remove the InvoiceLines from the related entities
for(BookingLine bookingLine : addedLines.keySet()) {
bookingLine.getInvoiceLines().remove(addedLines.get(bookingLine));
}
}
Это работает, но чувствует зло. Есть ли способ лучше?
Спасибо.
Что вы делаете, называется «компенсационная транзакция». В вашем случае вы хотели бы остаться с текущей транзакцией, отбирая ее части. В принципе, вы действуете так, как commit/rollback недоступны для вас, но вы остаетесь в пределах одной транзакции. У меня не было бы проблем с этим, учитывая, что вы действительно не можете использовать commit/rollback для достижения того же. – topchef