gpt4 book ai didi

hibernate - 一对多关系的 JPA/Hibernate 映射表

转载 作者:行者123 更新时间:2023-12-03 12:55:47 26 4
gpt4 key购买 nike

我只使用 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 的引用(这是故意的),我不能使用mappedBy 属性,Hibernate 需要在 Comment 之间创建一个映射表。和 Assessment .默认情况下,它被命名为 ASSESSMENT_COMMENT。

如果我只有一套 CommentAssessment ,那将工作得很好。 ASSESSMENT_COMMENT 只有两列:
[ASSESSMENT_ID, COMMENT_ID]

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

现在问题来了:

因为我没有一套 Comment但是两个,Hibernate 尝试仅使用一个 ASSESSMENT_COMMENT 表来映射这两个集合。该表有 3 列:
[ASSESSMENT_ID, COMMENT_ID, AUDITCOMMENT_ID]

最重要的是,这 3 列被设置为不可为空。

那肯定行不通。例如,如果我在 auditComents 中只有一项而在评论中没有一项,hibernate 会尝试在 COMMENT_ID 中插入一行空值,这会创建 SQL 异常。

问题:

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

那么,1) 它是 Hibernate 中的一个已知错误吗? 2)有没有办法解决这个问题?我可以强制 Hibernate 创建两个映射表,每个映射表一个。请记住,我无法更改 Comment类引用 Assessment (业务逻辑需求)

最佳答案

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

@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 中有解释.

关于hibernate - 一对多关系的 JPA/Hibernate 映射表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13876799/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com