1

次のエンティティがあります (短いバージョン):

GroupOfStudents:

@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 があります。Centuria や Cohort など、さまざまな GroupOfStudents があります。しかし、コホートの数値フィールドを 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 に答える