2016-03-08 39 views
0

一個可以存在我有2個表: 1)事務表 2)付款表 方案是: 記錄在事務表而不在付款 具有記錄可以存在表。休眠一個與不同的表的一對一映射而無需其他

我需要在Transaction和Payment表之間有一對一的映射關係。 交易可以在今天完成,付款也可以在稍後完成。但是付款表中的記錄應該在交易表中有一個映射。

交易表: id作爲主鍵

支付能力: id作爲主鍵 TRANSACTION_ID爲外鍵參照ID在事務表。

我做象下面這樣:

@Entity 
@Table(name = "Transaction_Table") 
public class Transaction { 
    @Id 
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SOMESEQ") 
@SequenceGenerator(name = "SOMESEQ", sequenceName = "SOMESEQ") 
@Column(name = "ID",unique = true, nullable = false) 
private Integer id; 

@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
@JoinColumn(name = "transaction_Id", insertable = false, updatable = false) 
private Payment payment; 

... other properties 
} 

@Entity 
@Table(name = "Payment_Table") 
public class Payment { 
    @Id 
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SOMESEQ2") 
@SequenceGenerator(name = "SOMESEQ2", sequenceName = "SOMESEQ2") 
@Column(name = "ID",unique = true, nullable = false) 
private Integer id; 

@OneToOne 
@PrimaryKeyJoinColumn 
private Transaction trn; 

... other properties 
} 

現在,如果我嘗試在交易表中插入它給錯誤「約束衝突」爲無效插入到TRANSACTION_ID支付表。

如何更改我的代碼,以便如果我插入到事務表中,那麼它不應嘗試插入付款表中。當我保存到支付表中時,它獲得了它的外鍵值(當我從交易表中獲取記錄時設置 - 如何設置該值?通過支付類的設置程序?)

您可以請建議嗎?

+0

您的地圖與您的描述完全不符。您有兩個單獨的OneToOne關聯:一個應該在事務中使用外鍵列,指向付款,但此列與用於事務ID的列相同,這沒有任何意義。另一種是說支付的ID也是交易的外鍵。在任何情況下,您都沒有任何transaction_id外鍵付款。閱讀您正在使用的註釋的javadoc。閱讀Hibernate文檔。 –

+0

我編輯了列名,這是一個錯誤。在支付表中只有一個外鍵,即引用交易表的主鍵。 –

回答