为什么@UniqueConstraint不能从超类中找到列?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么@UniqueConstraint不能从超类中找到列?相关的知识,希望对你有一定的参考价值。

我有这个实现公共属性的超类和一个继承它的子类:

@MappedSuperClass
@NoArgsConstructor
@Getter
public abstract class BaseEntity extends Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    protected String id;

    @Setter
    protected String orgId;
}

@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Table(uniqueConstraints = @UniqueConstraints(columnNames = {"org_id", "name"}))
public class SimpleEntity extends BaseEntity {

    @NotNull
    @Column(nullable=false)
    private String name;
}

这给了我一个运行时错误,JPA / Hibernate抱怨在SimpleClass表上找不到“org_id”列。但是,当我查看数据库时,该列确实存在于表中。

如果我将唯一约束注释更改为下面的那么它可以工作:

@Table(uniqueConstraints = @UniqueConstraints(columnNames = {"orgId", "name"}))

虽然我很高兴我找到了解决办法,但我正在努力理解为什么。别人也看过这个吗?我是否确实必须为继承的属性而不是实际的列名称引用Java属性名称?

答案

名为“orgId”的字段的默认映射将映射到名为“orgId”的列,而不是“org_id”。

所以你需要告诉Hibernate字段orgId的列必须是org_id

 @Column(name = "org_id")

以上是关于为什么@UniqueConstraint不能从超类中找到列?的主要内容,如果未能解决你的问题,请参考以下文章

从超类调用子类的方法

子类是不是从超类继承私有实例变量

从超类调用子类方法

从超类列表中提取给定子类的元素

从超类的指针调用时,基类函数不会覆盖超类函数

从超类中获取子类的名称