我有2张桌子: 1)交易表 2)付款表 场景是: 在没有付款记录的情况下,可以存在交易表中的记录 表
我需要在Transaction和Payment表之间建立一对一的映射。 交易可以在今天完成,付款也可以在以后的某个时间完成。但是,支付表中的记录应该在Transaction表中有一个映射。
交易表: id为主键
付款方式: id为主键 transaction_Id作为引用Transaction表中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
}
现在,如果我尝试在事务表中插入,则会出现错误"约束违规"用于将null插入到支付表的transaction_Id中。
如何更改我的代码,以便如果我插入到Transaction表中,那么它不应该尝试在支付表中插入。当我保存到Payment表中时,它获取其外键值(当我从事务表中获取记录时设置 - 如何设置它?通过Payment类的setter?)
你们可以建议吗?
答案 0 :(得分:1)
您可以在下面的链接中查看hibernate中的一对一关系 http://www.tutorialspoint.com/hibernate/hibernate_one_to_one_mapping.htm
实际上两个表之间应该有相同的主键,即事务表的主键也应该是指支付表的主键。