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支付表。
如何更改我的代碼,以便如果我插入到事務表中,那麼它不應嘗試插入付款表中。當我保存到支付表中時,它獲得了它的外鍵值(當我從交易表中獲取記錄時設置 - 如何設置該值?通過支付類的設置程序?)
您可以請建議嗎?
您的地圖與您的描述完全不符。您有兩個單獨的OneToOne關聯:一個應該在事務中使用外鍵列,指向付款,但此列與用於事務ID的列相同,這沒有任何意義。另一種是說支付的ID也是交易的外鍵。在任何情況下,您都沒有任何transaction_id外鍵付款。閱讀您正在使用的註釋的javadoc。閱讀Hibernate文檔。 –
我編輯了列名,這是一個錯誤。在支付表中只有一個外鍵,即引用交易表的主鍵。 –