JPA & RequestFactory: Постоянство иностранных ключей - PullRequest
1 голос
/ 05 июля 2011

В моем классе сущности JPA у меня есть:

@Entity
public class Booking {
@Id
@SequenceGenerator(name = "BOOKING", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "BOOKING")
private Integer id;

@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(nullable = false)
private User user;

// ...
}

В моем GWT View у меня есть:

    MainRequestFactory.BookingRequest bookingRequest = reqFactory.bookingRequest();
    BookingProxy bookingProxy = bookingRequest.create(BookingProxy.class);
    UserProxy userProxy = bookingRequest.create(UserProxy.class);

    userProxy.setId(12);

    bookingProxy.setUser(userProxy);

    Request<Void> persistRequest = bookingRequest.persist().using(bookingProxy);
    persistRequest.fire(new Receiver<Void>() {
        @Override
        public void onSuccess(Void response) {
            GWT.log("persisted");
        }
    });

/////////////////////

Users и Bookings постоянство без ограничения пользователя работает нормально. Но с помощью вышеуказанного кода я хочу / должен назначить пользователя с идентификатором «12» для вновь созданного бронирования. Но я не могу присвоить новое бронирование уже существующему идентификатору пользователя 12. Я получаю следующую ошибку:

[EL Warning]: 2011-07-05 18: 48: 45,464 - UnitOfWork (267787945) - Исключение [EclipseLink-4002] (Eclipse Постоянные Услуги - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DatabaseException Внутренняя ошибка: org.firebirdsql.jdbc.FBSQLException: GDS Исключение. 335544665. Нарушение ПЕРВИЧНОЕ или УНИКАЛЬНОЕ КЛЮЧЕВОЕ ограничение «INTEG_388» на таблице «USERS2»

Это потому, что пользователь с идентификатором «12» уже существует, и JPA хочет создать нового пользователя с тем же идентификатором, а не просто создавать новое бронирование с идентификатором пользователя «12» в качестве внешнего ключа.

Как я могу сказать RequestFactory НЕ создавать нового пользователя, а вместо этого просто назначить идентификатор пользователя уже существующего пользователя новой записи бронирования?

1 Ответ

4 голосов
/ 05 июля 2011

Я думаю, что ваш анализ проблемы правильный.

Вместо того, чтобы создавать пользователя, используйте EntityManager find () или getReference () для извлечения существующего элемента пользователя.

...