2013-03-01 2 views
2

Я немного смущен двунаправленным отношением OneToOne и удалением сирот. Это мои объекты:orphanRemoval = true двунаправленный OneToOne

@Entity 
@Table(name = "city") 
public class City { 

    @Id 
    @GeneratedValue 
    @Column 
    public Long _UID; 

    @OneToOne(mappedBy="city", orphanRemoval = true, cascade=CascadeType.ALL) 
    public Mayor mayor; 
} 

@Entity 
@Table(name = "mayor") 
public class Mayor { 

    @Id 
    @GeneratedValue 
    @Column 
    public Long _UID; 

    @OneToOne(optional=false) 
    public City city; 
} 

И если я пытаюсь эту сделку:

City c = em.find(City.class, (long) 1); 
AssertNotNull(c.getMayor());//gives true 
Mayor m = new Mayor("Ed", "Lee"); 
c.setMayor(m); 
m.setCity(c); 
em.flush(); //This creates new Mayor and adds it to City, but don't delete an old one. 

Если установить мэра Null и флеш, прежде чем установить новый, он работает:

City c = em.find(City.class, (long) 1); 
AssertNotNull(c.setMayor());//gives true 
c.setMayor(null); 
em.flush(); 
Mayor m = new Mayor("Ed", "Lee"); 
c.setMayor(m); 
m.setCity(c); 
em.flush(); //This creates new Mayor and adds it to City, but don't deletes an old one. 

I используйте Hibernate 4 как реализацию JPA2.

+0

1. Вы можете попробовать без '(необязательно = false)' ??? ... 2. вам нужно выполнить 'em.clear()' после 'em.flush()' – Alex

ответ

1

Это известная проблема в Hibernate (и на самом деле в спецификации JPA).

См. this bug report для получения дополнительной информации о проблеме и о возможных обходных решениях. Существует another ticket по тому же вопросу, за который вы можете проголосовать, поскольку первый уже закрыт.

0
  1. удалите (optional=false)
  2. вы должны сделать em.clear() после em.flush()
+0

Thanx, но с тем же Усиление :( – speechkey