returnreason-table中有三行,我不想在那儿有更多行。用户只需选择以下三个原因之一,而我只希望id进入rma-table。现在,每次插入新的rma时,都会在原因表中插入新行。我可以取消表之间的关系,但是我想知道是否存在更好的解决方案,以避免在保留rma对象时插入新行?如果我从类Rma中取消了层叠类型,它就没有帮助/工作。然后我收到一条错误消息,jpa找到了一个对象,该对象没有持久化或类似的东西。

如果我选择了层叠类型,则会显示错误消息


  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;

最佳答案

JPA方法要求模型使用托管实体,而您似乎正在尝试将托管实体与上下文之外的内容相关联。这是一种不好的做法,并且JPA被要求引发异常,因为它无法告知您打算对非托管实例执行的操作。

你有两个选择


阅读您的3 Returnreason,并使用这些实体进行合并。
如果确实只有3个,则可以更改缓存选项
因此它们始终在缓存中,以便进行em.find操作
不必点击数据库。
删除Rma类中到Returnreason类的映射,然后
将returnreasonReturnreasonId字段映射为基本映射。您
然后可以直接在Rma实体中设置值


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

10-07 12:52