2009-06-15 1 views
0

Что такое передовая практика 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)); 
    } 
    } 

Это работает, но чувствует зло. Есть ли способ лучше?

Спасибо.

+1

Что вы делаете, называется «компенсационная транзакция». В вашем случае вы хотели бы остаться с текущей транзакцией, отбирая ее части. В принципе, вы действуете так, как commit/rollback недоступны для вас, но вы остаетесь в пределах одной транзакции. У меня не было бы проблем с этим, учитывая, что вы действительно не можете использовать commit/rollback для достижения того же. – topchef

ответ

2

Ограничения на базу данных создаются из структуры ваших объектов. Другими словами, если вы нарушаете ограничения, что-то не так с вашими объектными отношениями. Например, у вас есть A, указывающий на B, но B не указывает на A, или вы указали какое-либо отношение, чтобы не допускать null, и существует нуль.

По этой причине вы должны не полагаться на ограничения, чтобы ваша модель объекта была последовательной. Было бы лучше и меньше подвержено ошибкам, если на самом деле вы убедились, что ваша объектная модель была согласованной, проверяя объектную модель, а не полагаясь на базу данных, чтобы сделать это.

Кроме того, исключение не является исключением, поскольку исключение не является исключительным случаем. Исключения существуют для обработки ошибок, они должны быть «нормальным» путем работы.

По этой причине, с точки зрения вашего примера, я предлагаю вам скорее проверить валюту, а если ее там нет, не добавляйте свои данные в постоянный магазин.

+0

+1 Я тоже так часто это делаю, однако причина вопроса заключалась в том, чтобы определить, был ли у кого-то хороший подход к откату. Вы не всегда можете предсказать каждый результат, и часто приятно полагаться на обработку исключений. – Damo

Смежные вопросы