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

时间:2013-06-12 06:42:22

标签: jpa jpa-2.0 eclipselink

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

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

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

}

如您所见,此实体包含资源

的集合
@Entity
public class Resource{

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinTable(name = "RESOURCE_TYPE_CROSS", joinColumns = { @JoinColumn(name = "RESOURCE_ID") }, inverseJoinColumns = { @JoinColumn(name = "RESOURCE_TYPE_ID", referencedColumnName = "ID") })
    private List<ResourceType> resourcesTypes = new ArrayList<>();
}

所以我想如果我获得所有资源类型的所有资源,这个集合在本地缓存中。

但如果我尝试坚持资源:

    @Override
    public ResourcesDTO createResource(ResourcesDTO resource) throws CreateResourceException {

    if (resource.getResourcesTypes().isEmpty()) {
        throw new CreateResourceException("Can not create resouce " + resource.getName()
                + " none resource types is set");                                      
    resourceDAO.create(map(resource));      

    log.debug("Created resource: " + r);
    resource.setId(r.getId());

    return resource

    }

如果我使用ResourcesTypes持有资源,接下来我将获得所有ResourceTypes实体管理器找不到新资源。但是在我的交叉表resource_type_cross中一切正常。我会在创建新资源后尝试做类似的事情:

for(ResourceType rt : resource.getResourceTypes()){
    em.refresh(rt);
}

但它不能正常工作。我将重新启动服务器一切都很好。但是为什么实体管理器不刷新资源类型?

这是我用来阅读所有ResourceTypes的内容:

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

}

如下文:http://www.tikalk.com/java/load-tree-jpa-and-hibernate

主要问题是: 一方创建或更新实体不更新另一方,所以在我的情况下,我按资源实体创建和更新资源类型,但我使用资源类型来获取所有资源。

1 个答案:

答案 0 :(得分:2)

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

其次,刷新ResourceTypes时是否刷新或提交了更改?通过在代码中设置引用而不是查询来刷新每个ResourceType

,可能更好地维护双方