2013-03-13 64 views
0

我想找到一種方法來檢索通過級聯在數據庫中持久化的實體的自動生成的Id。我使用Hibernate 4.1.9,Spring數據1.2和Spring框架3.2.1。以下是有問題的實體:位置,家庭,房間。檢索實體自動生成ID

位置父類

@Entity 
@Table(name = "location") 
@Inheritance(strategy = InheritanceType.JOINED) 
public class Location implements Serializable 
{ 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Column(name = "location_id", unique = true) 
private long uuid; 

// other attributes and methods not relevant 
} 

首頁類延伸的位置,引用了一組房間

@Entity 
@Table(name = "home") 
@Inheritance(strategy = InheritanceType.JOINED) 
@PrimaryKeyJoinColumn(name = "home_id") 
public class Home extends Location implements Serializable 
{ 

@OneToMany(mappedBy = "containingHome", cascade = {CascadeType.ALL}, orphanRemoval = true) 
private Set<Room> rooms; 
// other attributes and methods not relevant 
} 

終於房類引用Home對象

@Entity 
@Table(name = "room") 
@PrimaryKeyJoinColumn(name = "room_id") 
public class Room extends Location implements Serializable 
{ 

@ManyToOne() 
@JoinColumn(name = "home_id") 
protected Home containingHome; 
// other attributes and methods not relevant 
} 

我的使用Spring數據爲實體創建存儲庫。

LocationRepository

public interface LocationRepository extends JpaRepository<Location, Long> 
{ } 

我遇到的問題是,我需要的ID,以便能夠從數據庫中檢索對象的不同而自動生成。我可以通過元素訪問id的唯一方法是當我將它保存到數據庫時得到託管對象。但是,如果我嘗試依次保存每個位置,像這樣:

Home home = new Home(); 
home = locationService.save(home) // service that just calls locationRepository.save method 
Room bedroom = new Room(home); 
bedroom = locationService.save(bedroom); 

我得到的房間裏,我認爲是關係到Hibernate的問題https://hibernate.onjira.com/browse/HHH-7404數據庫中的重複條目。如果我只是叫

Home home = new Home(); 
Room bedroom = new Room(home); 
locationService.save(home) 

沒有雙打,但我也沒有辦法來檢索房間對象,因爲它是持續的級聯和其ID爲0,有沒有辦法解決這個問題,而不會引入其他字段的方式位置就像我必須生成自己的獨特名稱?任何幫助深表感謝。

編輯

如果在最後的情況下,我有home = locationService.save(home),然後調用home.getUuid()我得到正確的值,它是正常的,我認爲,因爲我檢索管理對象。但如果我做bedroom.getUuid()我得到0,因爲臥室沒有管理,所以它沒有更新其數據庫中的值的ID字段。

回答

0

您是否嘗試過在持續通話後致電home.getUuid();(假設您有該字段的getter)?

您可能會感到驚訝,但Hibernate(和JPA)將使用該id更新內存副本。

+0

我eddited我的問題,問題是我不知道如何正確檢索房間對象ID。 – iad 2013-03-13 16:15:38

+0

所以真正的問題是房間沒有被持續,當封閉的家是正確的? – WPrecht 2013-03-13 17:16:49

+0

如果我進行SQL查詢,但是代碼中的臥室對象被視爲未保存的瞬態實例,則可以正確地設置數據庫中的表中的家庭和房間條目。那麼這意味着臥室對象在家中時不會被添加到PersistenceContext中?如果這是可以預料的,我有點困惑。 – iad 2013-03-14 09:08:09