mysqlデータベース(Module - < Module_has_Subject> - Subject)に多対多の関係があります。エンティティはEclipseで生成され、両方のクラスでメソッド 'add'を追加しました。私はJBoss AS7/Hibernateを使用しています。 EJBでpersistメソッドを呼び出すと、org.hibernate.exception.ConstraintViolationExceptionが発生します。キー 'PRIMARY'に重複するエントリ '3'があります。私はそれが些細な間違いでなければならないことを知っているが、私はそれを見ない。私はStackoverflowとroseindia(私はカスケード、targetEntityを追加...)とまだ成功せずにほとんどの関連する問題をここに行った。テーブル用のエンティティは、そのような通りです:JPA/Hibernateでキー 'PRIMARY'の重複エントリ
Module.java
@Entity
@Table(name="Module")
public class Module implements Serializable {
@Id
@Column(unique=true, nullable=false)
private int idModule;
//bi-directional many-to-many association to Subject
@ManyToMany(mappedBy="modules", fetch=FetchType.EAGER,targetEntity=entity.Subject.class,cascade=CascadeType.ALL)
private List<Subject> subjects;
public void addSubject(Subject subject) {
if(subject.getModules() == null) {
subject.setModules(new ArrayList<Module>());
}
if(getSubjects() == null) {
setSubjects(new ArrayList<Subject>());
}
if (!getSubjects().contains(subject)) {
getSubjects().add(subject);
}
if (!subject.getModules().contains(this)) {
subject.getModules().add(this);
}
}
...}
Subject.java
@Entity
@Table(name="Subject")
public class Subject implements Serializable {
@Id
@Column(unique=true, nullable=false)
private int idSubject;
//bi-directional many-to-many association to Module
@ManyToMany(fetch=FetchType.EAGER, targetEntity=entity.Module.class,cascade=CascadeType.ALL)
@JoinTable(
name="Module_has_Subject"
, joinColumns={
@JoinColumn(name="Subject_idSubject", nullable=false, referencedColumnName="idSubject")
}
, inverseJoinColumns={
@JoinColumn(name="Module_idModule", nullable=false, referencedColumnName="idModule")
}
)
private List<Module> modules;
public void addModule(Module module) {
if(getModules() == null) {
setModules(new ArrayList<Module>());
}
if(module.getSubjects() == null) {
module.setSubjects(new ArrayList<Subject>());
}
if (!getModules().contains(module)) {
getModules().add(module);
}
if (!module.getSubjects().contains(this)) {
module.getSubjects().add(this);
}
}
...}
SubjectEJB.java
...
Subject subject = new Subject();
for(Module module : subjectModules) {
subject.addModule(module);
}
em.persist(subject);
em.flush();
...
あなたはデータを2回保存していますか? –
私は願っていません:P。双方向マッピングのための既存のコードですべてを作った(http://www.java2s.com/Code/Java/JPA/ManyToManyBidirectionalMapping.htm)。これはメソッドaddModuleとaddSubjectです。私が理解しているように、永続化される前に、すべてのエンティティとその参照を作成することは開発者次第です。この場合、たとえば、ModulesをSubjectに割り当てた場合(またはその逆の場合)には、Moduleエンティティでの参照をSubjectオブジェクトに戻す必要があります。そしてModuleがすでに永続化されている場合、依然としてSubjectに対して、つまり彼との関係で参照を与えなければなりませんか? – MinastionLyg