Hibernate一对一映射与不同的表一个可以存在而没有其他

时间:2016-03-08 07:05:35

标签: java hibernate foreign-keys optional one-to-one

我有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?)

你们可以建议吗?

1 个答案:

答案 0 :(得分:1)

您可以在下面的链接中查看hibernate中的一对一关系 http://www.tutorialspoint.com/hibernate/hibernate_one_to_one_mapping.htm

实际上两个表之间应该有相同的主键,即事务表的主键也应该是指支付表的主键。