8

Embedded アノテーションを使用して JPA での関係を試みていますが、うまく実行できず、

ここで、私のデータベースSQLスクリプトは次のとおりです。

create table TBL_COLLEGE(
   id integer primary key generated always as identity (start with 1000, increment by 5),
   name varchar(50)
)

create table TBL_COURSE(
   Id  integer primary key generated always as identity (start with 10, increment by 1),
   college_Id integer references TBL_COLLEGE,
   name varchar(50)
)

JPAのコードは次のとおりです。

@Embeddable
public class Course {
...
...
..
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
@Column(name="ID")
private Integer courseId;

@Column(name="NAME")
private String courseName;

@Column(name="COLLEGE_ID")
private Integer collegeId;
....
// getter and setter
}

これが大学のマッピングです。

@Entity
@Table(name="TBL_COLLEGE")
public class College implements Serializable{
   @Id
   @GeneratedValue(strategy= GenerationType.IDENTITY)
   @Column(name="ID")
   private Integer collegeId;

   ...
   ..
   @ElementCollection(targetClass=Course.class,fetch= FetchType.LAZY)
   @CollectionTable(name="TBL_COURSE",joinColumns=@JoinColumn(name="COLLEGE_ID"))
   private Set<Course> course;
   ..
   // getter and setter
}

しかし、Courses コレクション セットで College を永続化しようとすると、例外が発生します。

ERROR: HCANN000002: An assertion failure occurred (this may indicate a bug in Hibernate)
org.hibernate.annotations.common.AssertionFailure: Declaring class is not found in the inheritance state hierarchy: com.entities.Course

....
..

私のアプローチが間違っているかどうか教えてください. または @CollectionTable に対する私の理解はまだ最小限です.

4

3 に答える 3

8

両方のテーブルに独自のID列があるため、Hibernate は両方を@Entity型にする必要があります。 @Embeddables独自のものはありませんID。したがって、最初のステップは、対応するなどに変更Courseすることです。@Entity@TableName

これは 2 番目の問題につながります。つまり、Courseオブジェクトのコレクションは ではなく、からの外部キーであると指定されたエンティティ コレクションで@ElementCollectionある必要があります。@OneToMany@JoinColumnCOLLEGE_IDTBL_COURSE

最後に、CourseinのコレクションCollegeCollegeid inを持つことで、双方向の関連付けCourseが必要であることを暗示しています。そのことの他の影響の中でも、大学の学位を取得するべきではありません。あなたは単に参照を持っているべきです。->からナビゲートする必要がない場合は、Hibernate のオブジェクト マッピングをよりよく理解するまで、今のところ削除することをお勧めします。IDCourseCollegeCourseCollege

于 2013-03-14T13:09:27.777 に答える
0

私のアプローチは適切ではありませんが、コードにいくつかの小さな変更を加えても機能しましたが、

まず、テーブル TBL_COURSE を削除し、次のように新しいテーブルを作成しました。

create table TBL_COURSE(    
   college_Id integer references TBL_COLLEGE,
   name varchar(50)
)

ここでは、主キーを削除したことがわかります。現在は参照キーと名前のみです。

今Course.javaで、私は次のことをしました、

@Embeddable
public class Course {

// constuctor

@Column(name="NAME")
private String courseName; 
..
// setter getter
}

ここでは @Id アノテーションと id プロパティを削除し、College_Id マッピングも削除しました。

コードの残りの部分は、College.java にあるものと同じです。

そしてそれは働いた、

意見お待ちしております

于 2013-03-14T13:40:07.963 に答える
-3

2つのpojoについての結合を定義する必要があります

@OneToMany
@JoinColumn(name=course table column id)
private Set<Course> course;
于 2013-03-14T12:34:14.960 に答える