Jpa eclipselink在另一个实体尝试持久化收集时出现错误

Jpa eclipselink在另一个实体尝试持久化收集时出现错误,jpa,jpa-2.0,eclipselink,Jpa,Jpa 2.0,Eclipselink,您好,我有一个包含对象集合的实体: @Entity public class ResourceType{ @Id public Integer id; @ManyToMany(mappedBy = "resourcesTypes") private Set<Resource> resources = new HashSet<>(); } 如果我使用ResourcesType设置资源,然后我将获得所有ResourceTypes实体管理器未找到的新资

您好,我有一个包含对象集合的实体:

@Entity
public class ResourceType{
   @Id
   public Integer id;

  @ManyToMany(mappedBy = "resourcesTypes")
  private Set<Resource> resources = new HashSet<>();

}
如果我使用ResourcesType设置资源,然后我将获得所有ResourceTypes实体管理器未找到的新资源。但是在我的交叉表资源类型中,一切都正常。创建新资源后,我将尝试这样做:

for(ResourceType rt : resource.getResourceTypes()){
    em.refresh(rt);
}
但它不能正常工作。在我重新启动服务器之后,一切都很好。但为什么实体管理器不刷新资源类型

这是我用来阅读所有资源类型的内容:

public ResourceType getAllResourceTypes(){
    em.createQuery("Select n from Resource n left join fetch n.children"); 
    return em.find(ResourceType.class, 0); //0 - ROOT
}

如下第条:

主要问题是:
一方创建或更新实体不更新另一方,因此在我的示例中,我按资源实体创建和更新资源类型,但我使用resource type获取所有资源。

首先,您的多个映射存在问题。您已使双方单向访问同一联接表,而不是双向访问。一方应控制映射,另一方由拥有方设置为mappedby


第二,刷新ResourceType时是否刷新或提交了更改?通过在代码中设置引用而不是查询来刷新每个ResourceType来维护双方可能更好,因此我尝试添加@manytomy(mappedBy=“resources”)private Set resourcesTypes=new HashSet();但它不起作用?什么不起作用,您删除了JoinTable注释吗?它不会解决您当前的问题,但确实需要纠正,否则您将遇到问题。如果调用时数据在数据库中,则刷新将起作用。尝试打开EclipseLink日志记录,查看何时何地写出语句以及刷新发生。我正在按照你的建议编辑我的问题。为什么如果我正确地使用resourceTypes持久化resource,接下来我将使用resources获取所有resource类型,以便此查询不会返回刚刚创建的资源实体?我不明白但如果我重启glassfish,一切都会好起来……JPA不会为你维持关系。实体被视为常规java对象,因此如果不维护双向关系的两侧,则另一侧将保持不变,直到实体刷新为止。重新启动服务器将清除缓存,这与刷新相关实体相同。我以为您看到的是为什么refresh没有从关系表中提取更改。这是一个问题吗?问题是为什么em不刷新ResourceType?我正在编辑我的问题并添加查询,我正在使用该查询获取所有子资源类型。。。。
for(ResourceType rt : resource.getResourceTypes()){
    em.refresh(rt);
}
public ResourceType getAllResourceTypes(){
    em.createQuery("Select n from Resource n left join fetch n.children"); 
    return em.find(ResourceType.class, 0); //0 - ROOT