通过添加到实体列表来持久化多对多实体

时间:2012-10-01 17:35:55

标签: many-to-many openjpa persist

我正在获取一个实体列表,并尝试向它添加更多值并将它们保留到数据库中...我遇到了一些问题这样做...这是我到目前为止所拥有的...

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;
}

1 个答案:

答案 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类是托管的,因此您不需要合并该实体;提交事务时,更改应自动生效。