一对多关系的JPA/Hibernate映射表 [英] JPA/Hibernate mapping table for One-to-many relationships

查看:21
本文介绍了一对多关系的JPA/Hibernate映射表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我仅使用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>();
}

(我跳过了getter、setter、级联注释和其他不相关的代码行)

评论:

@Entity
@Table(name = "COMMENT")
public class Comment{

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(columnDefinition = "text")
    private String text;
}

现在,因为Comment没有对Assessment的引用(这是故意的),所以我不能使用mappdBy属性,而Hibernate需要在CommentAssessment之间创建一个映射表。默认情况下,它被命名为EASSITY_COMMENT。

如果我在Assessment中只有一组Comment,那将非常好地工作。评估备注将只有两列:

[ASSESSMENT_ID, COMMENT_ID]

这将完美地表示一对多关系。

现在问题来了:

因为我没有一个Comment而是两个Comment集合,所以Hibernate尝试仅使用一个评估注释表来映射这两个集合。此表有3列:

[ASSESSMENT_ID, COMMENT_ID, AUDITCOMMENT_ID]

在此基础上,将这3列设置为不可为空。

这肯定行不通。例如,如果我在auditComents中只有一项,而在Comments中没有项,Hibernate会尝试在COMMENT_ID中插入一行NULL,这会创建一个SQL异常。

问题:

对我来说,它看起来像是一个错误。应该有两个映射表,而不是一个。

那么,1)它是Hibernate中已知的错误吗?2)有什么方法可以绕过它吗?我是否可以强制Hibernate创建两个映射表,每个映射表对应一个集合。请记住,我不能将Comment类更改为引用Assessment(业务逻辑要求)

推荐答案

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

@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>();

这当然在the documentation中解释。

这篇关于一对多关系的JPA/Hibernate映射表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆