JPA и RequestFactory: сохранение внешних ключей

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

@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 у меня есть:

    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]: 2011-07-05 18:48:45.464--UnitOfWork(267787945)--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions .DatabaseException Внутреннее исключение: org.firebirdsql.jdbc.FBSQLException: исключение GDS. 335544665. нарушение ограничения PRIMARY или UNIQUE KEY "INTEG_388" в таблице "USERS2"

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

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


person Alex    schedule 05.07.2011    source источник


Ответы (1)


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

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

person djna    schedule 05.07.2011
comment
Не могли бы вы уточнить это немного подробнее? Пожалуйста, имейте в виду, что я могу общаться с классами домена только через классы Proxy RequestFactory. - person Alex; 05.07.2011
comment
Я попытался заменить setUser(User user) {this.user = user;} в моем Booking.java на setUser(Integer id) { UserController userController = new UserControllerImpl(); this.user = userController.getReference(id);} но у меня та же ошибка. - person Alex; 05.07.2011
comment
Я не знаком с GWT, мое быстрое чтение документов натолкнулось на пример requestFactory.employeeRequest().findEmployee(employeeId) с использованием find(), а не create(), я предполагаю, но концептуально это звучит так: вам нужно: найти существующую запись, а не создавать новую. - person djna; 06.07.2011
comment
Да, findUser — это решение! Мой код GWT: Request‹Void› persistRequest = context.setUserReference(userId).using(bookingProxy); Мой серверный код (объект бронирования): this.setUser(User.findUser(userId)); entityController.create (это); - person Alex; 06.07.2011