Professions、Professionsのセット、ProfessionGroupsのセットをインポートします。プロフェッションはプロフェッショングループ全体に分散されています。Hibernate:重複するキー値がコレクションの一意性制約に違反しています
次のエンティティが定義されています。
@Entity
public class Profile extends BaseEntity<Profile> { // B.E. defines id, creation_time,etc..
@OneToMany(cascade = CascadeType.ALL)
private Collection<Profession> professions;
@OneToMany(cascade = CascadeType.ALL)
private Collection<ProfessionGroup> professionGroups;
// .. getters and setters
}
@Entity
private class Profession extends BaseEntity<Profession> {
@Column(unique = true)
private String name;
// getters and setters
}
@Entity
public class ProfessionGroup extends BaseEntity<ProfessionGroup> {
@Column(unique = true)
private String name;
@ManyToOne(cascade = CascadeType.All)
private Collection<Profession> professions;
// getters and setters
}
次のコードは、JSONとしてシリアライズいくつかのプロファイルを読み取り、データベースにそれを保存したい:
// ...
Profile p = ...; // read from json using some deserializer
p.getProfessionGroups().forEach(pg -> pg.setProfessions(p.getProfessions());
// ..
ProfileService profileService = ...; //
profileService.save(profile);
ProfileServiceには内部entityManager.persistを呼び出します(。 ..)。 ここでの問題は、すべての職種をすべての職種グループに配布したいときはいつでも「重複キー値が固有の制約に違反する」ということです。固有のキー制約違反を取得することなく、プロファイルを安全に保存するために何ができるのですか。 JPAは明らかに職業グループの各エントリのために新しい職業を作りたいと考えています。しかし、職業への言及は同じです。 merge(...)を呼び出すことはそのトリックをしなかった。
あなたの答えは正しいが、文脈はもう少し広まっていた。 – phobos