0

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

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

如您所见,我还有一个要删除的删除节点列表。我在某处听说您不需要对此类操作调用persist,并且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;
}
4

1 回答 1

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

于 2012-10-02T15:40:16.670 回答