2015-03-25 67 views
1

我是Hibernate的新手,我一直在努力堅持一個父實體,而不需要堅持一個子實體(因爲它已經存在並且之前已經加載)。Hibernate與OneToOne的關係 - 只保留父實體

我試圖在許多不同的互聯網網站上找到一些幫助,但沒有得到一個明確與我的問題有關的運氣。希望你們能幫忙。

試想以下情形:

我有一個實體(表A)引用其他實體(表B)。

@Entity 
@Table(name = "A") 
public class TableA implements Serializable{ 
    private static final long serialVersionUID = 1L; 

    @Id 
    @Column(name="idtablea") 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private int id; 

    @GeneratedValue(generator="IdBGenerator") 
    @GenericGenerator(name="IdBGenerator", strategy="foreign", 
      [email protected](value="tableB", name="property")) 
    private int idb; 
    @OneToOne 
    @JoinColumn(name = "idtableb", insertable = false, updatable = false) 
    private TableB tableB; 

    //other properties 

    //constructors 

    //getters and setters 
} 

和表B實體定義如下:

@Entity 
@Table(name = "B") 
public class TableB implements Serializable{ 
    private static final long serialVersionUID = 1L; 

    @Id 
    @Column(name = "idtableb") 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private int id; 

    //other properties 

    //constructors 

    //getters and setters 
} 

我構建表A的實例與表B的一個實例的基準。

現在,我想將TableA保存到數據庫(表A)並將其鏈接到表B,而無需保留TableB(因爲它在先前的事務中保留)。爲此,我現在用的是下面的代碼:

嚴重:org.hibernate.TransientObjectException:對象引用

Session session = this.sessionFactory.openSession(); 
Transaction tx = session.beginTransaction(); 
session.persist(TableA); 
tx.commit(); 
session.close(); 

每次試圖提交事務時執行上面的代碼後拋出以下異常一個 未保存的瞬態的實例 - 前 沖洗保存瞬態的實例:com.mypackage.TableB

能不能請幫助我理解的問題 這裏? 在此先感謝。

我使用Java 8,Hibernate 3.6.8和Spring 4.1.5。

回答

1

我構建了TableA的一個實例,引用了一個實例 TableB。

你從哪裏得到TableB的這個實例? 你必須從數據庫中加載它,它使用Hibernate API保存在另一個事務中(使用get或者最好是load,因爲你只想設置關係),然後將它從表A設置爲實體。看起來你正在創建一個新對象這是暫時的,然後將它從TableA中設置爲實體。由於關係圖包含一個瞬態實體,因此您會收到此錯誤。

+0

謝謝Shailendra。你是對的。我正在創建一個新的對象,而不是加載它。從數據庫加載實體後,我設法堅持父實體。 – 2015-03-25 10:59:23