2016-03-08 35 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

我编辑了列名,这是一个错误。在支付表中只有一个外键,即引用交易表的主键。 –

回答