在我的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视图中,我有:
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
持久性可以正常工作。但是使用上面的代码,我希望/必须将用户ID为“12”分配给新创建的预订。但我无法为现有的用户ID 12分配新的预订。我收到以下错误:
[EL警告]: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.违反 PRIMARY或UNIQUE KEY约束 表“USERS2”上的“INTEG_388”
这是因为身份ID为“12”的用户已经存在且JPA想要创建一个具有相同ID的新用户,而不是仅创建一个用户ID为“12”作为其外键的新预订。
如何告诉RequestFactory
不要创建新用户,而只是将现有用户的用户ID分配给新的预订条目?
答案 0 :(得分:4)
我认为您对问题的分析是正确的。
而不是创建用户,而是使用EntityManager find()或getReference()来检索现有的用户项。