我在使用嵌入式注释的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
}
但是,如果我尝试坚持学院的课程收藏集, 它给了我一个例外,
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的理解仍然很少, 我错了吗
答案 0 :(得分:8)
因为两个表都有自己的ID
列,所以Hibernate会希望它们都是@Entity
类型。 @Embeddables
没有自己的ID
。因此,第一步是将Course
更改为@Entity
,并使用相应的@TableName
等。
这导致了第二个问题,即Course
个对象的集合不应该是@ElementCollection
,它应该是@OneToMany
实体集合,带有{ {1}}指定@JoinColumn
将是来自COLLEGE_ID
的外键。
最后,通过TBL_COURSE
中Course
的集合以及College
中的College
ID,您暗示您需要bidirectional association }。除此之外,你不应该在Course
中拥有该学院的ID
。您应该只有Course
引用。如果您不需要从College
- > Course
导航,您可能希望暂时删除它,直到您更好地了解Hibernate&#39; s对象映射。
答案 1 :(得分:0)
你必须定义关于两个pojo的连接
@OneToMany
@JoinColumn(name=course table column id)
private Set<Course> course;
答案 2 :(得分: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 annotation和id属性,我甚至删除了College_Id映射,
,其余代码与College.java中的相同,
它有效,
等待意见