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文档。 –
我编辑了列名,这是一个错误。在支付表中只有一个外键,即引用交易表的主键。 –