我正在获取一个实体列表,并尝试向它添加更多值并将它们保留到数据库中...我遇到了一些问题这样做...这是我到目前为止所拥有的...
Provider prov = emf.find(Provider.class, new Long(ID));
这个实体有很多关系,我想添加到
List<Organization> orgList = new ArrayList<Organization>();
...
orgList = prov.getOrganizationList();
所以我现在有了与该实体相关的实体列表 我搜索了一些要添加的实体,并将它们放在orgList ...
中List<Organization> updatedListofOrgss = emf.createNamedQuery("getOrganizationByOrganizationIds").setParameter("organizationIds", AddThese).getResultList();
List<Organization> deleteListOfOrgs = emf.createNamedQuery("getOrganizationByOrganizationIds").setParameter("organizationIds", DeleteThese).getResultList();
orgList.addAll(updatedListofOrgss);
orgList.removeAll(deleteListOfOrgs);
如您所见,我还有一个要删除的删除节点列表。 我听说某个地方你不需要坚持这样的操作,并且JPA会自动保留。好吧,它似乎没有这样的方式。你能坚持这种方式,还是我必须通过链接表实体,并以这种方式添加这些值?
public class Provider implements Serializable {
@Id
@Column(name="RESOURCE_ID")
private long resourceId;
...
@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(name="DIST_LIST_PERMISSION",
joinColumns=@JoinColumn(name="RESOURCE_ID"),
inverseJoinColumns=@JoinColumn(name="ORGANIZATION_ID"))
private List<Organization> organizationList;
...//getters and setters.
}
将组织和提供者链接在一起的链接表......
public class DistListPermission implements Serializable {
@Id
@Column(name="DIST_LIST_PERMISSION_ID")
private long distListPermissionId;
@Column(name="ORGANIZATION_ID")
private BigDecimal organizationId;
@Column(name="RESOURCE_ID")
private Long resourceId;
}
答案 0 :(得分:2)
问题是您缺少@ManyToMany注释的级联规范。 @ManyToMany的默认级联类型不是级联类型,因此不会保留对集合的任何更改。您还需要添加@ElementDependent注释,以确保从数据库中删除从集合中删除的任何对象。因此,您可以按如下方式更改您的Provider实现:
@ManyToMany(fetch=FetchType.EAGER, cascade=CascadeType.ALL)
@ElementDependent
@JoinTable(name="DIST_LIST_PERMISSION",
joinColumns=@JoinColumn(name="RESOURCE_ID"),
inverseJoinColumns=@JoinColumn(name="ORGANIZATION_ID"))
private List<Organization> organizationList;
由于您的Provider类是托管的,因此您不需要合并该实体;提交事务时,更改应自动生效。