确定 Hibernate 中哪个类拥有方

Posted

技术标签:

【中文标题】确定 Hibernate 中哪个类拥有方【英文标题】:Decide which class is owning side in Hibernate 【发布时间】:2020-03-18 08:32:46 【问题描述】:

我有Role 类,它是用户角色的主要实体,该表中有2 个FK,它们分别指向两个字典:PrivelegeUnit 类。

所以我认为这是多 (Role) 对一 (Privelege/Unit) 关系。

问题:

    Hibernate 在我的代码中的映射是否正确?

    在我的情况下,哪个类是“拥有方”,为什么?

    我应该在哪个班级写@JoinColumn,在哪里写mappedBy

正如我在其他帖子中所读到的:@JoinColumn 注释在拥有外键的类中维护。”

但在 Hibernate 的文档中,我看到 mappedBy 用于拥有方(参见示例 163。双向 @OneToOne)。 4. 如果我删除了一些Role 记录会怎样?如果我从字典中删除一些记录会影响Role 的记录吗?我可以覆盖此行为以禁用级联吗?

我假设我的“角色”类是拥有方,因为它的 FK 指向了 2 个字典。所以它拥有FK。因此,我需要在这里使用@JoinColumn 作为其拥有方,并在两个字典中使用mappedBy,因为它是由拥有方映射的。我说的对吗?

更新:“拥有方”是“父方”的同义词吗?

角色类

@Entity
@Table(name="ROLES_NEW", schema="MAPP")
public class Role implements GrantedAuthority 

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID", nullable = false)
    private Long id;

    @Column(name = "ROLENAME")
    private String roleName;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "UNIT_ID")
    private Unit unit;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "PRIVELEGE_ID")
    private Privelege privelege;

...


特权班


@Entity
@Table(name="PRIVELEGES", schema="MAPP")
public class Privelege /*implements GrantedAuthority*/ 

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID", nullable = false)
    private Long id;

    @Column(name = "PRIVELEGENAME", length = 255, nullable = false)
    private String privelegeName;

    @Column(name = "descr", length = 255, nullable = false)
    private String descr;

    @OneToMany(mappedBy = "privelege")
    Set<Role> role;

...



单元类

@Entity
@Table(name="UNITS", schema="MAPP")
public class Unit 
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID", nullable = false)
    private Long id;

    @Column(name = "UNITNAME")
    private String unitname;

    @OneToMany(mappedBy = "unit")
    Set<Role> role;

   ...


【问题讨论】:

【参考方案1】:

是的,子实体拥有关系,因为那是外键所在的那一侧。这种映射在@ManyToOne 的情况下效率最高。

同样的事情也适用于映射为两个双向@ManyToOne 的多对多关系。也可以通过@JoinTable注解来实现,但是这种方式效率较低。

@OneToOne 的情况下,虽然子(外键持有者)拥有关系,但在父端使用@MapsId@JoinColumn 时可以获得最佳性能。有关该异常的更多信息,请参阅here。

当涉及到mappedBy 时,它很简单——当关系是双向的并且在一边@JoinColumn不是 时使用它(孩子有@JoinColumn,父母 - mappedBy)。

当谈到最佳休眠映射时,我推荐 Vlad Mihalcea 的博客:one-to-many、many-to-many。

P.S.:更喜欢 List 而不是 Set 映射多对多关系 (source)。

【讨论】:

你写“子实体拥有关系,因为那是外键所在的一侧”。但是我有具有 FK 和“@JoinColumn 提示”的 Role 类,所以它拥有关系并且可以称为“父方”?我哪里错了? @user3434906 “拥有方”不是“父类”的同义词,相反。 Role 在您的示例中拥有关系(具有 fk),因此它是一个子实体。查看此答案以了解这些术语的说明:***.com/a/5340916/7606764

以上是关于确定 Hibernate 中哪个类拥有方的主要内容,如果未能解决你的问题,请参考以下文章

hibernate的注解属性mappedBy详解

hibernate的注解属性mappedBy详解

Hibernate映射文件

运行第二天出现hibernate的错误,org.hibernate.TransactionException: JDBC commit failed at org.hiber

Hibernate + spring 版本兼容性

Hibernate→ 《Hibernate程序开发》教材大纲