您好我有一个包含对象集合的实体:
@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
主要问题是: 一方创建或更新实体不更新另一方,所以在我的情况下,我按资源实体创建和更新资源类型,但我使用资源类型来获取所有资源。
答案 0 :(得分:2)
首先,您的ManyToMany映射存在问题。您已使双方单向访问相同的连接表而不是双向。一方应控制映射,另一方设置为由拥有方映射。
其次,刷新ResourceTypes时是否刷新或提交了更改?通过在代码中设置引用而不是查询来刷新每个ResourceType
,可能更好地维护双方