2014-01-09 152 views
1

我的對象休眠添加實體子實體ID

State.java

Entity 
@Table(name = "STATE") 
public class State { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @Column(name = "NAME", nullable = false) 
    private String name; 
} 

City.java

@Entity 
@Table(name = "CITY") 
public class City extends BaseEntity { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @Column(name = "NAME", nullable = false) 
    private String name; 

    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "STATE_ID", nullable = false) 
    private State state; 
} 

我想添加一個新的城市,我有城市名稱和州ID。要添加一個新城市我執行

  • 從狀態表中獲取狀態。 State state = (State) hibernateManager.get(State.class, id);
  • 在城市設置狀態。 city.setState(state)
  • 執行保存城市運行。 hibernateManager.save(city);

由於我有國家身份證,並在城市表中只有Id將被存儲。那麼是否有任何方法可以讓我們在不調用狀態表的情況下簡單地執行save(city)將執行相同的任務。

+0

@ R.J感謝您的回覆。除JDBC外,在休眠中還有其他選擇。 –

+0

@ R.J已經嘗試過但會有例外。 –

+0

@ R.J你的生活狀態是什麼意思。由於城市只包含州標識。它的狀態對象是否被更改(刪除情況除外)是否有關係?答案爲 –

回答

1

您可以單獨使用STATE_ID列並映射到狀態。然後爲了保存城市,您可以簡單地設置stateId。請注意@JoinColumn(insertable = false,updatable = false)中使用的屬性以避免着名的重複列異常。

@ManyToOne(fetch = FetchType.EAGER) 
@JoinColumn(name = "STATE_ID", insertable = false, updatable=false) 
private State state; 

@Column(name = "STATE_ID") 
private Long stateId; 
+0

感謝它工作正常 –

0

由於您沒有State對象,所以您必須從數據庫中檢索它,然後才能將其分配給City對象。

一種選擇是:你可以改變你的模型,從而代替抱着國家的參考,它只是持有到該國的ID參考:

@Entity 
@Table(name = "CITY") 
public class City extends BaseEntity { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @Column(name = "NAME", nullable = false) 
    private String name; 

    @Column(name = "STATE_ID", nullable = false) 
    private String stateId; 
} 

,然後你的操作變爲:

city.setStateId(stateId); 
hibernateManager.save(city); 

雖然這樣做的缺陷是要檢索包含城市和州的對象圖,我認爲您必須在兩個表上進行顯式加入。因爲我沒有足夠的信譽評論:對於RJ的回答,我認爲如果一個具有該狀態ID的對象已經存在於數據庫中(這種情況下,會引發Hibernate異常) ,它似乎已經存在),因爲你不能有兩個具有相同主鍵的對象。

+0

。但是這會說明hibernate的使用和數據的回收會變得複雜。 –

+0

啊好的。 :)是否有任何理由,特別是你想消除檢索狀態對象?它不應該是那麼多開銷看到它的一個簡單的獲得 – Angelina

+0

首先,我不得不做一個數據庫調用,這是不需要的,因爲我有stateId,它最終保存在數據庫不是完整的狀態。這個問題在這種情況下很簡單。但是在我的應用程序中,有很多相互關係,因此在調用這麼多的db調用時都是如此。 –