2

基本的に、ルート例外「@NaturalId only valid on root entity (またはその @MappedSuperclasses)」を検索タブに貼り付けるだけで、Googleで同様の問題を見つけることができません。結合された複数テーブルの継承戦略を使用して、抽象的な親( Person )を含む具象/子エンティティ( StudentEmployee ) をデータベース内の 3 つのテーブルにマップしていますが、これまでのところ問題はありませんでした。 Student のStudentIdを使用して、私の Student Entity のカスタム クエリを実装する必要があります。. 基になる Hibernate-session を Entity-manager から抽出することに成功し、最愛の HibernateSession から必要なメソッドを明確に確認して使用できるようになりました (Hibernate には (byId、byNaturalId などの) naturalIds のメソッドがあることは誰もが知っています)。 )、これらの種類のメソッドは、エンティティのクエリに非常に役立ちます。そのため、studentId データ メンバーに@NaturalIdでアノテーションを付けるまで..何らかの操作 (保存/作成) を実行すると、複数行の例外がスローされます。そして根本的な原因は..

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

追加情報としてエンティティのコードを貼り付けます

Parent抽象基本クラス

人物クラス

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(name="PERSON_TYPE")
@Table(name="PERSON")
public abstract class Person {

@Id
@GeneratedValue
@Column(name="person_ent_id", insertable = false)
private int personId;

@Column(name = "first_name")
private String firstName;

@Column(name = "last_name")
private String lastName;

@Column(name = "age")
private int age;

@Column(name = "postal_id")
private String postalId;

.. getter and setter methods declarations

Entityサブクラス

学生クラス

@Entity
@Table(name = "STUDENT")
@DiscriminatorValue("S")
@PrimaryKeyJoinColumn(name = "student_ent_id", referencedColumnName = "person_ent_id")
public class Student extends Person {

@Column (name = "student_ent_id", insertable=false, updatable=false)
private int studentEntId;

@NaturalId
@Column(name = "school_id")
private String schoolId;

@Column(name = "school_name")
private String shoolName;

public Student() {
    super();
}

...getter and setter methods declarations

質問: さまざまな学生エンティティに対して一意のクエリを作成するためにできることはありますか? Hibernate の naturalId メソッドは、get や update などのエンティティを操作するのに非常に便利だからです。

エンティティとデータベース テーブルを使用して設計を犠牲にすることなく、目的を達成するための回避策はありますか? 可能であれば、studentId を naturalId として機能させたいと考えています。提案/ヘルプ/コメントをお願いします。どんなことでも大歓迎です。

4

1 に答える 1

2

いいえ、残念ながらこれは不可能です。テーブル全体に対してのみ NaturalId クエリを作成できるため、ルート エンティティ上にある必要があるためだと思います。ただし、schoolId がすべての生徒に対して一意であることのみを確認したい場合は、 を使用できます@Column(name = "school_id", unique = true)

于 2014-10-31T09:45:31.280 に答える