确定 Hibernate 中哪个类拥有方
Posted
技术标签:
【中文标题】确定 Hibernate 中哪个类拥有方【英文标题】:Decide which class is owning side in Hibernate 【发布时间】:2020-03-18 08:32:46 【问题描述】:我有Role
类,它是用户角色的主要实体,该表中有2 个FK,它们分别指向两个字典:Privelege
和Unit
类。
所以我认为这是多 (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的错误,org.hibernate.TransactionException: JDBC commit failed at org.hiber