Откат отношений с внешним ключом с Hibernate - PullRequest
0 голосов
/ 15 июня 2009

Какова наилучшая практика 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));
    }
  }

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

A bookingLine.clear() не годится, так как может иметь другие уже сохраненные строки InvoiceLines, связанные с ним.

Спасибо.

1 Ответ

2 голосов
/ 23 июня 2009

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...