我只使用JPA注释和Hibernate 4.0.1作为JPA实现。
我有一个Assessment
类,其中有两组Comment
:
@Entity
@Table(name = "ASSESSMENT")
public class Assessment{
@OneToMany(fetch = FetchType.EAGER)
private Set<Comment> auditComments = new HashSet<Comment>();
@OneToMany(fetch = FetchType.EAGER)
private Set<Comment> comments = new HashSet<Comment>();
}
< p > < em > (我跳过了获取器,设置器,级联注释和其他不相关的代码行)
评论:
@Entity
@Table(name = "COMMENT")
public class Comment{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(columnDefinition = "text")
private String text;
}
现在,由于
Comment
没有指向Assessment
的引用(这是故意的),我不能使用mappedBy属性,Hibernate需要在Comment
和Assessment
之间创建一个映射表。默认情况下,它的名字为ASSESSMENT_COMMENT。
如果在Assessment
中只有一组Comment
,那么就可以完美地工作。 ASSESSMENT_COMMENT将只有两列:
[ASSESSMENT_ID, COMMENT_ID]
这将完美地表示一对多的关系。
现在问题来了:
因为我有两个 Comment
集合,Hibernate 试图仅使用一个 ASSESSMENT_COMMENT 表来映射这两个集合。该表有3列:
[ASSESSMENT_ID, COMMENT_ID, AUDITCOMMENT_ID]
此外,这3列被设置为非空。但是这样显然行不通。例如,如果auditComents中只有一个项目,而comments中没有,则Hibernate尝试插入一个带有COMMENT_ID为空的行,从而创建SQL异常。
问题:
在我看来,这似乎是一个错误。应该有两个映射表,而不是一个。
那么,1)Hibernate中是否已知此错误?2)有没有办法解决它?我能否强制Hibernate创建两个映射表,分别用于每个集合?请注意,我无法更改Comment类以引用Assessment(业务逻辑要求)。
commentedAssessment
和一个字段auditedAssessment
。它们将使用@ManyToOne
进行映射,使用上面的连接表,但是连接列和反向连接列会交换。在Assessment中,你只需要有@OneToMany(mappedBy = "auditedAssessment") private Set<Comment> auditComments;
和@OneToMany(mappedBy = "commentedAssessment") Set<Comment> comments;
。 - JB Nizet