在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;
答案 0 :(得分:1)
JPA方法要求模型使用托管实体,而您似乎试图将托管实体与上下文之外的内容相关联。这是一种不好的做法,JPA需要抛出异常,因为它无法告诉您打算如何处理非托管实例。
您有两个选择
第一个选项可能是最常用的,并且确实是必需的,因为每次添加新的Rma实例时都应该维护Returnreason rmaCollection。虽然看起来你只需要设置Rma.returnreasonReturnreasonId,但这些是java对象,你的应用程序负责维护双向关系的双方。