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 アノテーションを追加して、コレクションから削除されたオブジェクトがデータベースから確実に削除されるようにする必要があります。そのため、プロバイダーの実装を次のように変更できます。

@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 に答える