2013-10-19 151 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來存放城市,那麼該列表可能包含兩個相同對象(==)的元素。