带连接列的Hibernate Merge问题

时间:2016-09-02 11:58:32

标签: java mysql hibernate jpa orm

我正在使用带有JPA2 / Hibernate5和mySql的java 8。

+--------+    +----------------+    +------------+ 
| Rating |    | Rating_Person  |    | Person     |
+--------+    +----------------+    +------------+ 
| ID     |    | RAT_ID         |    | ID         |
| PERSON |    | PER_ID         |    | USERNAME   | 
+--------+    +----------------+    +------------+

我有一个RATING对象的实体PERSON。当我尝试merge RATING时,会收到错误,因为数据库中已有PERSON,其中包含唯一列值USERNAME

entityManager.merge(rating);

我收到以下错误:

  

重复录入' richardmarais'关键字' USERNAME_UNIQUE'

看起来我不需要尝试添加新的PERSON。我甚至不需要更新PERSON

我尝试将代码更新为:

    Person person = rating.getPerson();
    Person dbPerson = personService.findByUserName(person.getUserName());
    if (dbPerson != null) {
        rating.setPerson(dbPerson);
    }
    entityManager.merge(rating);

但我明白了:

  

尝试保存评分[null]时出错。多   同一实体的表示[com.jobs.spring.domain.Person#8]   正在合并。分离:[com.jobs.spring.domain.Person@30466c01];   管理:[com.jobs.spring.domain.Person@7c2ba1a2]

有人可以告诉我如何在不添加新RATING的情况下添加新的PERSON吗?

我尝试在@Column对象上添加PERSON注释,告诉它不要添加新的PERSON

@ManyToOne(cascade = CascadeType.ALL, fetch=FetchType.EAGER)
@JoinTable
(
    name="rating_person",
    joinColumns={ @JoinColumn(name="RAT_ID", referencedColumnName="ID") },
    inverseJoinColumns={ @JoinColumn(name="PER_ID", referencedColumnName="ID") }
)
@Column(insertable = false, updatable = false)
private Person person;

但是在开始的时候我得到了。

  

@ManyToOne属性不允许使用@Column:   com.jobs.spring.domain.Rating.person

当我阅读RATING实体时,我确实需要获取关联的PERSON

1 个答案:

答案 0 :(得分:0)

如果我先设置已连接的实体,则可以正常工作。

    Person person = personDao.findById(rating.getPerson().getId());
    Job job = jobDao.findById(rating.getJob().getId());
    rating.setPerson(person);
    rating.setJob(job);
    rating = super.merge(rating);