Hibernate实体中的复合@NaturalId
Composite @NaturalId in Hibernate entity
对于实体应用程序的生成 ID,使用触发器。因此,为了将生成的值分配给实体,我们使用这样的结构:
@Id
@Column(name = "INVOICE_ID")
@GeneratedValue(generator = "trigger")
@GenericGenerator(name = "trigger", strategy = "org.hibernate.id.SelectGenerator")
private Long invoiceId;
@Column(name = "INVOICE_AMOUNT")
@NaturalId(mutable = true)
private Double invoiceAmount;
SelectorGenerator
需要对某些字段使用 @NaturalId
,该字段应该具有(逻辑上)唯一值。但是有些表没有任何具有所有唯一值的字段。 SelectGenerator
不支持多个自然 ID。我们怎样才能摆脱这种情况?
作为此类情况的可用解决方案,我们更改了一些获取实体 ID 的机制。而不是使用
@GenericGenerator(name = "trigger", strategy ="org.hibernate.id.SelectGenerator")
我们更喜欢使用数据库序列生成器
@Id
@Column(name = "INVOICE_ID")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "invoice_id_seq")
@SequenceGenerator(name = "invoice_id_seq", sequenceName = "INVOICE_ID_SEQ")
private Long invoiceId;
它不需要 @NaturalId
,它解决了我们的问题。
对于实体应用程序的生成 ID,使用触发器。因此,为了将生成的值分配给实体,我们使用这样的结构:
@Id
@Column(name = "INVOICE_ID")
@GeneratedValue(generator = "trigger")
@GenericGenerator(name = "trigger", strategy = "org.hibernate.id.SelectGenerator")
private Long invoiceId;
@Column(name = "INVOICE_AMOUNT")
@NaturalId(mutable = true)
private Double invoiceAmount;
SelectorGenerator
需要对某些字段使用 @NaturalId
,该字段应该具有(逻辑上)唯一值。但是有些表没有任何具有所有唯一值的字段。 SelectGenerator
不支持多个自然 ID。我们怎样才能摆脱这种情况?
作为此类情况的可用解决方案,我们更改了一些获取实体 ID 的机制。而不是使用
@GenericGenerator(name = "trigger", strategy ="org.hibernate.id.SelectGenerator")
我们更喜欢使用数据库序列生成器
@Id
@Column(name = "INVOICE_ID")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "invoice_id_seq")
@SequenceGenerator(name = "invoice_id_seq", sequenceName = "INVOICE_ID_SEQ")
private Long invoiceId;
它不需要 @NaturalId
,它解决了我们的问题。