@ElementCollection @CollectionTable在一对多映射中

Rah*_*ran 8 java hibernate jpa jpa-2.0

我在使用嵌入式注释的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)
)
Run Code Online (Sandbox Code Playgroud)

以下是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
}
Run Code Online (Sandbox Code Playgroud)

这是学院的地图,

@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
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我试着坚持学院的课程收藏集,它给了我一个例外,

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

....
..
Run Code Online (Sandbox Code Playgroud)

你能否告诉我我的方法是否错误,或者我对@CollectionTable的理解仍然很少,我是否会出错

sha*_*kan 8

因为你的两个表都有自己的ID列,所以Hibernate会希望它们都是@Entity类型. @Embeddables没有自己的ID.所以,第一步是要改变Course@Entity,与对应的@TableName

这导致了第二个问题,即Course对象的集合不应该是一个@ElementCollection,它应该是一个@OneToMany实体集合,并@JoinColumn指定COLLEGE_ID将是来自的外键TBL_COURSE.

最后,通过拥有Coursein 的集合College以及Collegeid Course,你暗示你想要一个双向关联.除此之外,你不应该拥有ID大学的影响力Course.你应该只是College参考.如果您不需要从Course- > 导航College,您可能希望暂时删除它,直到您更好地理解Hibernate的对象映射.