2012-04-30 18 views
3

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(); 
... 
+0

あなたはデータを2回保存していますか? –

+0

私は願っていません:P。双方向マッピングのための既存のコードですべてを作った(http://www.java2s.com/Code/Java/JPA/ManyToManyBidirectionalMapping.htm)。これはメソッドaddModuleとaddSubjectです。私が理解しているように、永続化される前に、すべてのエンティティとその参照を作成することは開発者次第です。この場合、たとえば、ModulesをSubjectに割り当てた場合(またはその逆の場合)には、Moduleエンティティでの参照をSubjectオブジェクトに戻す必要があります。そしてModuleがすでに永続化されている場合、依然としてSubjectに対して、つまり彼との関係で参照を与えなければなりませんか? – MinastionLyg

答えて

5

あなたが管理している場合、私は知りませんまだあなたの問題を解決してください。しかし、まさに同じ問題を抱えています。

私の@OneToManyマッピングでは、エンティティを保存しようとしたときに2つのレコードが保存されるという結果になったCascade.ALLを使用しました。 (重複したデータは、異なるIDの)

ウェブ上でスクロールした後、私はこのhttp://forums.codeguru.com/showthread.php?t=511992を見つけたので、私はあなたが「ConstraintViolationExceptionを持って、エラーの原因となった{CascadeType.PERSIST、CascadeType.MERGE}、にCascadeType.ALLから変更:重複エントリ '9-2-2012-05-30'キー 'PlayerId' "

最後に私はCascade.MERGEを削除し、重複エントリエラーと重複したレコードを修正したCascadeType.PERSISTを残しました。ポイントとして

私はちょうどMERGEまたはちょうどPERSISTを使用している場合、私は

たぶん、あなたがエラーを取得する場合、単にMERGEでみてください、MERGEで試してみて、PERSISTエラーや無重複データ何を取得していません。

これは理想的ではありませんが、助けてください。

クリス

関連する問題