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

时间:2015-05-08 07:36:32

标签: java mysql jpa eclipselink one-to-many

enter image description here

在returnreason-table中有三行,我不想在那里有更多行。用户只需选择三个原因中的一个,我只想要rma-table的id。现在,每次插入新的rma时,它都会向reason-table插入一个新行。我可以在表之间取消关系,但我想知道是否有更好的解决方案来避免在持久化rma对象时插入新行?如果我从类Rma中取出cascadeType,它就没有帮助/工作。然后我收到一条错误消息,jpa发现了一个没有持久存在的对象。

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

  

java.lang.IllegalStateException:在同步过程中,通过未标记为级联的关系找到了一个新对象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;

1 个答案:

答案 0 :(得分:1)

JPA方法要求模型使用托管实体,而您似乎试图将托管实体与上下文之外的内容相关联。这是一种不好的做法,JPA需要抛出异常,因为它无法告诉您打算如何处理非托管实例。

您有两个选择

  1. 读入您的3 Returnreason并使用这些实体进行合并。 如果真的只有3,你可以改变你的缓存选项 所以它们总是在缓存中,以便进行em.find操作 没有必要打到数据库。
  2. 将Rma类中的映射删除到Returnreason类和 将returnreasonReturnreasonId字段映射为基本映射。您 然后可以直接在Rma实体中设置值
  3. 第一个选项可能是最常用的,并且确实是必需的,因为每次添加新的Rma实例时都应该维护Returnreason rmaCollection。虽然看起来你只需要设置Rma.returnreasonReturnreasonId,但这些是java对象,你的应用程序负责维护双向关系的双方。