5

我只使用 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 需要在Commentand之间创建一个映射表Assessment。默认情况下,它被命名为 ASSESSMENT_COMMENT。

如果我只有一组Commentin 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(业务逻辑要求)

4

1 回答 1

8

首先,您可以使用评论表中的两列来指向他们的评估:

@OneToMany(fetch = FetchType.EAGER)
@JoinColumn(name = "audit_commented_assessment_id")
private Set<Comment> auditComments = new HashSet<Comment>();

@OneToMany(fetch = FetchType.EAGER)
@JoinColumn(name = "commented_assessment_id")
private Set<Comment> comments = new HashSet<Comment>();

如果您想要两个连接表,只需这样说:

@OneToMany(fetch = FetchType.EAGER)
@JoinTable(name = "assessment_audit_comment",
           joinColumns = @JoinColumn(name = "assessment_id"),
           inverseJoinColumns = @JoinColumn(name = "comment_id"))
private Set<Comment> auditComments = new HashSet<Comment>();

@OneToMany(fetch = FetchType.EAGER)
@JoinTable(name = "assessment_comment",
           joinColumns = @JoinColumn(name = "assessment_id"),
           inverseJoinColumns = @JoinColumn(name = "comment_id"))
private Set<Comment> comments = new HashSet<Comment>();

这当然在文档中进行了解释。

于 2012-12-14T10:38:17.857 回答