1

我有以下实体(短版):

学生组:

@Entity
@Table(name = "group_of_students")
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class AGroupOfStudents extends AModel {
}

百人队:

@Entity
@Table(name = "cohort")
@PrimaryKeyJoinColumn(name = "id")
public class Cohort extends AGroupOfStudents {

    @Column(nullable = false)
    // @NaturalId <- here is the problem
    private int number;
}

队列:

@Entity
@Table(name = "centuria")
@PrimaryKeyJoinColumn(name = "id")
public class Centuria extends AGroupOfStudents {

    @Column(nullable = false)
    // @NaturalId <- here is the problem
    private int cohort;


    @Column(nullable = false)
    // @NaturalId <- here is the problem
    private char maniple;
}

所以我有一个 GroupOfStudents 的 CourseLecture。有不同的 GroupOfStudents,例如 Centuria 或 Cohort。但我希望 Cohort 的 number 字段是 NaturalId。这将导致错误:

AnnotationException: @NaturalId only valid on root entity (or its @MappedSuperclasses)

但是为什么我只能在根实体上使用 @NaturalId 呢?如何在不破坏类继承的情况下解决这个问题?

4

1 回答 1

1

好的,我完全误解@NaturalId了,主要目的是通过这个 NaturalIds 在表上启用查询,所以这只适用于根实体是有意义的。

想要的是我的子实体的简单唯一约束,这可以通过以下方式实现:

@Column(unique = true)对于单列

@Table(name = "centuria", uniqueConstraints = { @UniqueConstraint(columnNames = { "cohort", "maniple", "letter" }) })对于多列

于 2014-10-31T09:49:27.100 回答