最近迁移到Sping Boot 3,遇到了以下问题。
@Audited
@Entity
class ParentEntity {
...
@NotAudited
@OneToOne(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
@JoinColumn(name = "trace_info_id")
@JsonIgnore
private TraceInfo traceInfo;
}
@Entity
@Table(name = "trace_infos")
public class TraceInfo extends IDEntity {
...
}
@Audited(
targetAuditMode = RelationTargetAuditMode.NOT_AUDITED
)
public class IDEntity {
@Id
@GeneratedValue
private Integer id;
}
当我试图插入一个记录到ParentEntity类中时,Hibernate会查找一个名为trace_infos_seq
的序列,但找不到它。在启动时,它生成的序列被称为trace_info_id_seq
。这是预期的行为吗?我如何让它找到正确的序列?
1条答案
按热度按时间ecr0jaav1#
在代码中,您已经使用
@JoinColumn
注解在ParentEntity
和TraceInfo
之间定义了@OneToOne
关系。@JoinColumn
注解指定所属实体表中用于建立关系的外键列的名称。当你使用
@JoinColumn(name = "trace_info_id")
时,Hibernate知道这个列是一个引用TraceInfo
实体的外键。但是,Hibernate不会根据外键列名生成序列名。相反,它根据引用实体的标识符列生成序列名(在本例中为TraceInfo
)。由于
TraceInfo
的标识符列是id
,Hibernate默认生成一个名为trace_info_id_seq
的序列。这就是为什么你在观察你提到的行为。要解决此问题,您可以使用
TraceInfo
实体上的@SequenceGenerator
注解显式指定序列名称:通过将
@SequenceGenerator
注解添加到TraceInfo
实体,您将指示Hibernate使用指定的序列名(trace_info_id_seq
)来为TraceInfo
实体生成标识符。看看这个: