EntityManager尝试创建现有实体

时间:2018-12-08 18:54:11

标签: java jpa persistence psql entitymanager

我正在创建一个允许用户创建酒店房间预订的应用程序。

我有实体房间,用户,预订

这些是我在实体类Reservation中设置的关系:

@Id
@GeneratedValue
private int id;

private Date reservationDate;   

@ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private Room room;

@ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private User user;

当我尝试使用Reservation保存包含现有User的新EntityManager.persist()对象时,我收到一个PSQLException,说“ id = ...”的用户违反了Unique-Constraint» user_pkey«,因为该用户已经存在。我如何告诉EntitiyManager不要尝试创建已经存在的User(以及以后的Room)?

1 个答案:

答案 0 :(得分:2)

您会收到此错误,因为JPA将持久性操作级联到user,这被视为一个新实体。

为防止这种情况:

reservation.setUser(entityManager.getReference(User.class, user.getId()));

其中getId必须被替换。

以上代码假定您对修改user不感兴趣。否则,需要合并操作:

reservation.setUser(entityManager.merge(user));