2013-10-19 104 views
0

我有一个线程休眠问题。 我与包含两个城市对象的轨道有ManyToOne关系。 通过线程,我的trackDao可能会获得许多trackEntitys来坚持女巫包括同一个城市(邮编是唯一的)。休眠 - 保存子如果不存在

trackDao坚持第一个实体后,我得到一个“重复的实体异常”。

是否可以通过annotaition进行配置来强制一个get bevore save来获取现有的childId并恢复parrent持久化?

THX


THX您的时间。

我尝试手动获取,然后尝试保存城市以从数据库获取可能已存在的城市(使用相同的邮政编码)。

现在,一次旅行包括两个城市。 一个城市女巫媒体链接存储在数据库(OBJECTID!= NULL) 和其他城市巫婆必须得到坚持(OBJECTID == NULL)

虽然现在冬眠必须知道city1已经持续了仅位于City2有要坚持城市表我会得到一个“重复的实体例外”。 Hibernate将再次存储现有的城市。 为了解决这个问题,我超越了我的tripDao的通用保存方法并处理了城市持续的手册。 - >只要保存城市,如果city.getId()== null。 所以我得到一个没有存储的旅行对象女巫包括两个已经存储的城市。如果我试图坚持这一趟对象我得到的消息休眠

“错误而坚持trackjavax.persistence.PersistenceException:org.hibernate.PersistentObjectException:通过分离的实体坚持:德.... CityEntity”

我相信我有一些配置错误。

请帮忙。

我不想超越保存方法和商店rearate手册。在我看来,必须默认工作,或不是?

@Entity 
@Table(name = "tracks", uniqueConstraints = @UniqueConstraint(columnNames = { "city1_id", "city2_id" })) 
@SessionScoped 
public class TrackEntity extends BaseEntity { 
    private static final long serialVersionUID = 4696847902782174082L; 

    @ManyToOne(targetEntity = CityEntity.class, fetch = FetchType.EAGER, cascade = CascadeType.PERSIST, optional=false) 
    @JoinColumn(name="city1_id") 
    private CityEntity city1; 

    @ManyToOne(targetEntity = CityEntity.class, fetch = FetchType.EAGER, cascade = CascadeType.PERSIST, optional=false) 
    @JoinColumn(name="city2_id", referencedColumnName="id") 
    private CityEntity city2; 

    private Integer distance; 





@Entity 
@Table(name = "cities") 
@SessionScoped 
public class CityEntity extends BaseEntity { 
    private static final long serialVersionUID = 8823384603378561475L; 

    private String name; 
    @Column(unique=true) 
    private String zipcode; 
    private String latitude; 
    private String longitude; 
+0

你能发表一些代码吗?你使用的是什么主键? – Thor

回答

0

我觉得一个赛道有两个相同的城市。我与订单 - > *产品有同样的问题。但这是一个订单不能有重复产品的应用程序中的错误。我不知道你的情况允许什么,但我建议你调查城市班级,并寻找等同的方法。如果在Track类中有java.util.List来存放城市,那么该列表可能包含两个相同对象(==)的元素。