8

我正在尝试使用嵌入式注释在 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为 be @Entity,与相应@TableName的等。

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

最后,通过收集CourseinCollege以及Collegeid in Course,您暗示您想要双向关联。除其他影响外,您不应该IDCourse. 你应该只是有College参考。如果您不需要从Course->导航College,您可能想暂时删除它,直到您对 Hibernate 的对象映射有了更好的理解。

于 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

您必须定义关于两个 pojo 的连接

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