我只使用 JPA 注释并使用休眠 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>();
}
(我跳过了 getter、setter、级联注释和其他不相关的代码行)
评论:
@Entity
@Table(name = "COMMENT")
public class Comment{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(columnDefinition = "text")
private String text;
}
现在,因为 aComment
没有返回的引用Assessment
(这是故意的),我不能使用mappedBy属性,Hibernate 需要在Comment
and之间创建一个映射表Assessment
。默认情况下,它被命名为 ASSESSMENT_COMMENT。
如果我只有一组Comment
in Assessment
,那会很好用。ASSESSMENT_COMMENT 将只有两列:
[ASSESSMENT_ID, COMMENT_ID]
这将完美地代表一对多的关系。
现在问题来了:
因为我Comment
只有两个,所以 Hibernate 尝试仅使用一个 ASSESSMENT_COMMENT 表来映射这两个集合。该表有 3 列:
[ASSESSMENT_ID, COMMENT_ID, AUDITCOMMENT_ID]
最重要的是,这 3 列设置为不可为空。
那肯定行不通。例如,如果我在 auditComments 中只有一项,而在评论中没有,hibernate 会尝试在 COMMENT_ID 中插入一行空值,这会创建 SQL 异常。
问题:
对我来说,它看起来像一个错误。应该有两个映射表,而不是一个。
那么,1)它是 Hibernate 中的一个已知错误吗?2)有没有办法解决这个问题?我可以强制 Hibernate 创建两个映射表,每个映射表一个。请记住,我无法更改Comment
类以引用Assessment
(业务逻辑要求)