Hibernate使用@JoinColumn作为序列名而不是表名

sycxhyv7  于 2023-10-23  发布在  其他
关注(0)|答案(1)|浏览(147)

最近迁移到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。这是预期的行为吗?我如何让它找到正确的序列?

ecr0jaav

ecr0jaav1#

在代码中,您已经使用@JoinColumn注解在ParentEntityTraceInfo之间定义了@OneToOne关系。@JoinColumn注解指定所属实体表中用于建立关系的外键列的名称。
当你使用@JoinColumn(name = "trace_info_id")时,Hibernate知道这个列是一个引用TraceInfo实体的外键。但是,Hibernate不会根据外键列名生成序列名。相反,它根据引用实体的标识符列生成序列名(在本例中为TraceInfo)。
由于TraceInfo的标识符列是id,Hibernate默认生成一个名为trace_info_id_seq的序列。这就是为什么你在观察你提到的行为。
要解决此问题,您可以使用TraceInfo实体上的@SequenceGenerator注解显式指定序列名称:

@Entity
@Table(name = "trace_infos")
@SequenceGenerator(name = "traceInfoSeq", sequenceName = "trace_info_id_seq", allocationSize = 1)
public class TraceInfo extends IDEntity {
    // ... your entity code here ...
}

通过将@SequenceGenerator注解添加到TraceInfo实体,您将指示Hibernate使用指定的序列名(trace_info_id_seq)来为TraceInfo实体生成标识符。
看看这个:

相关问题