【问题标题】:Why can't @UniqueConstraint find column from super class?为什么@UniqueConstraint 不能从超类中找到列?
【发布时间】:2018-02-28 20:06:45
【问题描述】:

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

@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”的列,而不是“org_id”,则名为“orgId”的字段的默认映射。所以你需要告诉 Hibernate 字段 orgId 的列必须是 org_id:@Column(name="org_id")。当询问异常时,总是,总是发布异常的完整堆栈跟踪。解释错误消息只会使问题更难识别。
  • 谢谢! @JBNizet 如果您将其发布为答案,那么我点击接受。

标签: java jpa unique-constraint


【解决方案1】:

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

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

 @Column(name = "org_id")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-13
    • 2016-02-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多