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的理解仍然很少,我是否会出错
因为你的两个表都有自己的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的对象映射.