2016-09-02 2 views
1

Я использую java 8 с JPA2/Hibernate5 и mySql.Ошибка слияния гибернации со связанной колонкой

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

У меня есть объект RATING, который имеет PERSON объект. Когда я попробую RATING, он получает сообщение об ошибке, поскольку в базе данных уже есть PERSON с уникальным значением столбца USERNAME.

entityManager.merge(rating); 

Я получаю следующее сообщение об ошибке:

Duplicate entry 'richardmarais' for key 'USERNAME_UNIQUE'

Похоже, мне нужно, чтобы не попробовать и добавить новый PERSON. Мне не нужно даже обновлять PERSON.

Я попытался обновить мой код:

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

Но я получаю:

There was an error trying to save Rating [null]. Multiple representations of the same entity [com.jobs.spring.domain.Person#8] are being merged. Detached: [[email protected]]; Managed: [[email protected]]

Может кто-нибудь пожалуйста, сообщите мне, как я могу добавить новый 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; 

Но тогда при запуске я получаю.

Когда я прочитал RATING лицо мне нужно, чтобы получить соответствующий PERSON хотя.

ответ

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); 
Смежные вопросы