2017-03-23 15 views
0

私はHibernateとMySQLでJava8を使用しています。外部キーを持つテーブルに新しい行を追加する方法

私が参加し、テーブルと次のテーブルがあります。

+-------+  +----------------+  +------------+ 
| job |  | person_job |  | person | 
+-------+  +----------------+  +------------+ 
| ID |  |  PER_ID  |  |  ID  | 
|  |  | JOB_ID (PK) |  +------------+ 
+-------+  +----------------+ 

を(PERSONJOBs多くを持つことができます)

私は新しいJOBを保存しようとすると、それが外部キーを持ってはに参加し、既存のPERSON。 Hibernateが新しいPERSONを保存して、重複したエントリを作成したかったようです。私はHibernateが十分にスマートであると思っていました。すでに一致するものがある場合はPERSONですが、もう一度保存しようとはしません。 JOBテーブルの行を保存しようとすると、次のエラーが発生

MySQLIntegrityConstraintViolationException: Duplicate entry '338-1688' for key 'PRIMARY' 

SQL

SELECT * FROM ebdb.person_job; 

PER_ID JOB_ID 
338  16 

SELECT * FROM ebdb.person 

ID 
338 

SELECT * FROM ebdb.job; 

ID 
16 

Job.java

@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
@JoinTable(name = "person_job", joinColumns = { 
     @JoinColumn(name = "JOB_ID", referencedColumnName = "ID") }, inverseJoinColumns = { 
       @JoinColumn(name = "PER_ID", referencedColumnName = "ID") }) 
private Person person; 

私がデバッグモードで実行すると、私はそれがmergeしようとしている新しいJob行はANと26PERSONIDを持って見ますID338であると予想される。

protected T merge(T entity) throws InstantiationException, IllegalAccessException { 
    T attached = null; 
    if (entity.getId() != null) { 
     attached = entityManager.find(entityClass, entity.getId()); 
    } 
    if (attached == null) { 
     attached = entityClass.newInstance(); 
    } 

    BeanUtils.copyProperties(entity, attached); 
    entityManager.setFlushMode(FlushModeType.COMMIT); 
    attached = entityManager.merge(attached); 

    return attached; 
} 

質問

は、どのように既存のエントリ(PERSON)に参加する外部キーを持って一つのテーブル(JOB)に新しいエントリを作成するのですか?

つまり、私はちょうど@ManyToOneの関係を維持したいと思います。

誰でも助けてください。

UPDATE

私が代わりにmergepersistをしようとすると、私が手:

永続化するために渡さ

外しエンティティ:com.jobs.spring.domain.Person

答えて

0

ソリューションを

添付ファイルで更新します。

  Person attached = entityManager.find(Person.class, person.getId()); 
      person = attached; 
      job.setPerson(person); 
関連する問題