java - EntityManager 尝试创建现有实体

标签 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;

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

最佳答案

您会收到该错误,因为 JPA 将持久操作级联到被视为新实体的 user

为了防止这种情况发生:

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

其中 getId 必须相应替换。

上面的代码假设您对修改用户不感兴趣。否则,需要进行合并操作:

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

关于java - EntityManager 尝试创建现有实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53685848/

相关文章:

java - 在实例参数上调用实例方法引用

java - EntityLIstener 未通过级联的 OneToOne 映射调用

java - Hibernate 正确的级联映射

java - 如何制作具有多种类型节点的树并且每个节点可以在java中有多个子节点

java - 监听器不起作用

java - 打印tomcat版本和路径

java - 服务层中的已检查异常与未检查异常

java - JPA/Hibernate 部署后找不到映射的类

java - 无法持久化实体(单向多对一关系)

python - Pythonic 生成器在可能的字母组合上的起始值