エンティティのリストに追加することによって、多対多事業体を持続する

StackOverflow https://stackoverflow.com//questions/12678161

  •  12-12-2019
  •  | 
  •  

質問

私はエンティティのリストを取得し、それにより多くの値を追加しようとしていて、それらをデータベースに持続させようとしています...

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

役に立ちましたか?

解決

問題は、@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;
.

あなたのプロバイダクラスは管理されているので、エンティティをマージする必要はありません。トランザクションがコミットされたときに変更が自動的に有効になるはずです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top