Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate如何使用外键向表中添加新行_Java_Mysql_Hibernate_Jpa - Fatal编程技术网

Java Hibernate如何使用外键向表中添加新行

Java Hibernate如何使用外键向表中添加新行,java,mysql,hibernate,jpa,Java,Mysql,Hibernate,Jpa,我将Java8与Hibernate和MySQL一起使用 我有以下带有联接表的表: +-------+ +----------------+ +------------+ | job | | person_job | | person | +-------+ +----------------+ +------------+ | ID | | PER_ID | | ID |

我将Java8与Hibernate和MySQL一起使用

我有以下带有联接表的表:

+-------+     +----------------+     +------------+
| job   |     |   person_job   |     |   person   | 
+-------+     +----------------+     +------------+
|  ID   |     |     PER_ID     |     |     ID     | 
|       |     |   JOB_ID (PK)  |     +------------+
+-------+     +----------------+   
(一个
可以有许多
工作

当我尝试保存一个新的
作业
时,它有一个外键join to and existing
PERSON
。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);