私はHibernateとMySQLでJava8を使用しています。外部キーを持つテーブルに新しい行を追加する方法
私が参加し、テーブルと次のテーブルがあります。
+-------+ +----------------+ +------------+
| job | | person_job | | person |
+-------+ +----------------+ +------------+
| ID | | PER_ID | | ID |
| | | JOB_ID (PK) | +------------+
+-------+ +----------------+
を(PERSON
がJOBs
多くを持つことができます)
私は新しい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と26
とPERSON
のID
を持って見ますID
が338
であると予想される。
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
私が代わりにmerge
のpersist
をしようとすると、私が手:
永続化するために渡さ外しエンティティ:com.jobs.spring.domain.Person