我已按以下方式在实体课程和实习生之间映射了双向多对多例外:
Course
{
...
private Collection<Trainee> students;
...
@ManyToMany(targetEntity = lesson.domain.Trainee.class,
cascade = {CascadeType.All}, fetch = {FetchType.EAGER})
@Jointable(name="COURSE_TRAINEE",
joincolumns = @JoinColumn(name="COURSE_ID"),
inverseJoinColumns = @JoinColumn(name = "TRAINEE_ID"))
@CollectionOfElements
public Collection<Trainee> getStudents() {
return students;
}
...
}
Trainee
{
...
private Collection<Course> authCourses;
...
@ManyToMany(cascade = {CascadeType.All}, fetch = {FetchType.EAGER},
mappedBy = "students", targetEntity = lesson.domain.Course.class)
@CollectionOfElements
public Collection<Course> getAuthCourses() {
return authCourses;
}
...
}
系统使用以下模式生成表“COURSE_TRAINEE”,而不是创建主键由两个外键组成的表(从相关的两个实体的表中导入),而不是:
我正在研究MySQL 5.1和我的应用程序。服务器是JBoss 5.1。 有谁猜到为什么?
答案 0 :(得分:3)
除了Bence Olah之外:未创建(COURSE_ID
,TRAINEE_ID
)对的主键约束,因为您的映射并未说明这些对是唯一的。您需要在代码中将Collection
更改为Set
以表示此限制,并且将创建主键。
答案 1 :(得分:2)
使用@CollectionOfElements OR @ManyToMany。不要同时使用它们! 请注意@CollectionOfElements是特定于Hibernate的,而@ManyToMany是基于JPA标准的。
进一步阅读: http://docs.jboss.org/ejb3/app-server/HibernateAnnotations/reference/en/html_single/index.html