@ManyToMany 関係に 2 つのエンティティがあります: Networks と SiteCodes。
ネットワーク:
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "network_id")
public int getNetworkId() {
return this.networkId;
}
public void setNetworkId(int networkId) {
this.networkId = networkId;
}
@ManyToMany(cascade = CascadeType.MERGE, fetch = FetchType.EAGER)
@JoinTable(name = "site_code_map",
joinColumns = { @JoinColumn(name = "network_id") },
inverseJoinColumns = { @JoinColumn(name = "site_code_id") })
public Set<SiteCodes> getSiteCodes() {
return siteCodes;
}
public void setSiteCodes(Set<SiteCodes> siteCodes) {
this.siteCodes = siteCodes;
}
サイトコード:
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "site_code_id")
public Integer getSiteCodeId() {
return this.siteCodeId;
}
public void setSiteCodeId(Integer siteCodeId) {
this.siteCodeId = siteCodeId;
}
@Column(name = "site_code", nullable = false)
@NotNull
@NaturalId
public String getSiteCode() {
return siteCode;
}
@ManyToMany(mappedBy="siteCodes",cascade = CascadeType.MERGE)
public Set<Networks> getNetworks() {
return networks;
}
public void setNetworks(Set<Networks> networks) {
this.networks = networks;
}
そして私のメインクラス:
session.beginTransaction();
Networks nw1 = new Networks(345);
Networks nw2 = new Networks(789);
SiteCodes sc1 = new SiteCodes("0123");
SiteCodes sc2 = new SiteCodes("0001");
SiteCodes sc3 = new SiteCodes("0ABC");
// The real code would do this inside a loop, ie create a new network, figure out
// the site codes and assign them.
session.beginTransaction();
Networks nw1 = new Networks(345);
nw1.getSiteCodes().add(sc1);
nw1.getSiteCodes().add(sc2);
session.merge(nw1);
session.getTransaction().commit();
session.beginTransaction();
Networks nw2 = new Networks(789);
nw2.getSiteCodes().add(sc3);
nw2.getSiteCodes().add(sc2);
session.merge(nw2);
session.getTransaction().commit();
その結果、重複エントリ エラーが発生します。
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '0001' for key 'site_code'
私はCascadeTypeと私が考えることができる他のものをいじりました。このトピックに関する既存の質問を精査しましたが、これを修正する方法はまだ見つかりません。私が試したバリエーションでは、代わりに「オブジェクトが保存されていない一時的なインスタンスを参照しています」というエラーが表示されることがあります。