oneToMany 连接时如何避免持久化新对象?

How to avoid persisting new object when oneToMany connection?

returnreason-table 中有三行,我不希望那里有更多行。用户只需选择三个原因之一,我只希望 id 为 rma-table。现在它每次插入新的 rma 时都会插入一个新行到 reason-table。我可以取消 table 之间的关系,但我想知道是否有更好的解决方案来避免在持久化 rma 对象时插入新行?如果我从 class Rma 中去掉 cascadeType,它就不是 helping/working。然后我收到一条错误消息,jpa 找到了一个对象,该对象未持久化或类似的东西。

错误消息,如果我关闭 cascadetype.ALL

java.lang.IllegalStateException: During synchronization a new object was found through a relationship that was not marked cascade PERSIST: com.entity.Returnreason[ returnreasonId=null ].

public class Rma implements Serializable {
@ManyToOne(cascade = CascadeType.ALL)
private Returnreason returnreasonReturnreasonId;

public class Returnreason implements Serializable {
@OneToMany(mappedBy = "returnreasonReturnreasonId", cascade = CascadeType.ALL)
private Collection<Rma> rmaCollection;

JPA 方法要求模型使用托管实体,而您似乎试图将托管实体与上下文之外的事物相关联。这是一种不好的做法,并且 JPA 需要抛出异常,因为它无法告诉您您打算对非托管实例执行什么操作。

你有两个选择

  1. 读入您的 3 Returnreason 并使用这些实体进行合并。 如果真的只有 3 个,您可以更改缓存选项 所以它们总是在缓存中,所以 em.find 操作 不必访问数据库。
  2. 删除 Rma class 到 Returnreason class 的映射,然后 将 returnreasonReturnreasonId 字段映射为基本映射。你 然后可以直接在Rma实体中设置值

第一个选项可能是最常用的,而且确实是必需的,因为每次添加新的 Rma 实例时都应该维护 Returnreason rmaCollection。虽然看起来您只需要设置 Rma.returnreasonReturnreasonId,但这些是 java 对象,您的应用程序负责维护双向关系的双方。