2011-07-05 71 views
1

在我的JPA實體類的持久性,我有:JPA和RequestFactory:外鍵

@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"); 
     } 
    }); 

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

UsersBookings沒有User Constraint的持久化工作正常。但是通過上面的代碼,我想/必須爲用戶分配ID爲「12」的新創建的預訂。但我不能分配新的預訂到已經存在的用戶ID 12.我收到以下錯誤:

[EL Warning]: 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 Internal Exception: org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544665. violation of PRIMARY or UNIQUE KEY constraint "INTEG_388" on table "USERS2"

這是因爲ID爲「12」已經存在和JPA要創建具有新用戶的用戶相同的ID,而不是僅以用戶ID「12」作爲其外鍵創建新的預訂。

我怎樣才能告訴RequestFactory不是要創建一個新用戶,而是僅僅將一個已經存在的用戶的用戶ID分配給一個新的預訂條目?

回答

4

我認爲你對問題的分析是正確的。

而不是創建一個用戶,而是使用EntityManager find()或getReference()來檢索現有的用戶項目。

+0

你能詳細說明一下嗎?請記住,我只能通過RequestFactory的代理類與域類通信。 – Alex

+0

我試着在我的Booking.java中用setUser(Integer id){UserController userController = new UserControllerImpl()來替換「setUser(User user){this.user = user;}」; this.user = userController.getReference(id);}但我有同樣的錯誤。 – Alex

+0

我對GWT並不熟悉,我對文檔的快速閱讀發現了使用find()而不是create()方法的示例requestFactory.employeeRequest()。findEmployee(employeeId),我猜測,但從概念上講,這聽起來像你需要:找到一個現有的條目,而不是創建一個新的條目。 – djna