Java Hibernate如何使用外键向表中添加新行
我将Java8与Hibernate和MySQL一起使用 我有以下带有联接表的表:Java Hibernate如何使用外键向表中添加新行,java,mysql,hibernate,jpa,Java,Mysql,Hibernate,Jpa,我将Java8与Hibernate和MySQL一起使用 我有以下带有联接表的表: +-------+ +----------------+ +------------+ | job | | person_job | | person | +-------+ +----------------+ +------------+ | ID | | PER_ID | | ID |
+-------+ +----------------+ +------------+
| job | | person_job | | person |
+-------+ +----------------+ +------------+
| ID | | PER_ID | | ID |
| | | JOB_ID (PK) | +------------+
+-------+ +----------------+
(一个人
可以有许多工作
)
当我尝试保存一个新的作业
时,它有一个外键join to and existingPERSON
。Hibernate似乎还想保存一个新的人员
,从而导致重复条目。我认为Hibernate足够聪明,如果已经有一个匹配的人
,它就不会再次尝试保存它
在尝试保存作业
表中的行时导致以下错误:
SQL
SELECT * FROM ebdb.person_job;
PER_ID JOB_ID
338 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;
当我在调试模式下运行时,我看到新的作业
行,它正试图合并
的ID
为26
,而PERSON
的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;
}
问题
如何在一个表(JOB
)上创建一个新条目,该表的外键连接到一个现有条目(PERSON
)
i、 e.我只想维持一种@manytone
关系
请任何人帮忙
更新
如果我尝试persist
而不是merge
,我会得到:
传递给persist的分离实体:com.jobs.spring.domain.Person
解决方案
我用附加的对象更新
Person attached = entityManager.find(Person.class, person.getId());
person = attached;
job.setPerson(person);
解决方案
我用附加的对象更新
Person attached = entityManager.find(Person.class, person.getId());
person = attached;
job.setPerson(person);
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 attached = entityManager.find(Person.class, person.getId());
person = attached;
job.setPerson(person);