@ElementCollection @CollectionTable在一对多映射中

时间:2013-03-14 12:15:11

标签: 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)
)

以下是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的理解仍然很少, 我错了吗

3 个答案:

答案 0 :(得分:8)

因为两个表都有自己的ID列,所以Hibernate会希望它们都是@Entity类型。 @Embeddables没有自己的ID。因此,第一步是将Course更改为@Entity,并使用相应的@TableName等。

这导致了第二个问题,即Course个对象的集合不应该是@ElementCollection,它应该是@OneToMany实体集合,带有{ {1}}指定@JoinColumn将是来自COLLEGE_ID的外键。

最后,通过TBL_COURSECourse的集合以及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中的相同,

它有效,

等待意见