使用 Hibernate 通过公共桥表映射 3 个实体

我想模拟一个团队需要多种技能才能运作的事实。许多人都可以拥有某种技能。一个人有很多技能。一个人可以是许多团队的一部分。


我使用 Hibernate 来模拟这个场景。我开始构建两个实体,团队和技能,并使用 @ManyToMany 注释来链接这些依赖项。尝试添加第三个实体人是困难的地方。我不明白我应该如何构建这个模型,非常感谢任何帮助。


我没有太多使用 Hibernate 的经验,所以这是一个挑战。


我搜索了信息,我发现的大多数示例都是关于两个连接的实体,但我无法扩展这些示例以包含第三个实体。


这些是我的实体:


package com.example.entity;


import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.Id;

import javax.persistence.ManyToMany;

import java.util.Set;


@Entity

public class Team {

    @Id

    @GeneratedValue

    private Long id;


    private String name;


    @ManyToMany

    private Set<Skill> skills;


    @ManyToMany

    private Set<Person> persons;

}




package com.example.entity;


import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.Id;

import javax.persistence.ManyToMany;

import java.util.Set;


@Entity

public class Skill {

    @Id

    @GeneratedValue

    private Long id;


    private String knowHow;


    @ManyToMany

    private Set<Team> teams;


    @ManyToMany

    private Set<Person> persons;

}




package com.example.entity;


import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.Id;

import java.util.Set;


@Entity

public class Person {

    @Id

    @GeneratedValue

    private Long id;


    private String name;


    private Set<Team> teams;

    private Set<Skill> skills;

}


MMMHUHU
浏览 195回答 3
3回答

30秒到达战场

解决此问题的一种方法是创建一个仅作为桥接实体存在的实体。这样您就可以在“真实”实体和桥接实体之间添加三个不同的一对多关系。这样你就应该能够处理三路多对多的关系。不过,您可能必须“手动”处理桥实体中的数据。

冉冉说

我认为这个问题是有道理的。假设团队只能看到他们自己添加的能力,在三个实体之间使用公共桥表允许通过设计实现行级安全。以在一个团队中使用 VB 的顾问为例。她真的很不喜欢VB,不想让她的其他团队知道她有这个技能。团队 A 可以知道人 A 具有技能 VB。B 队不应该知道 A 人有技能 VB。我会将此添加为评论,但我缺乏必要的声誉 =/

交互式爱情

恐怕你做不到。该模型包含逻辑不一致并可能导致矛盾。假设您有一个TeamA,其中包含 2 个成员(PersonA、PersonB)。PersonA包含SkillA并且PersonB包含SkillB。这意味着TeamA应该包含 2 个技能(SkillA和SkillB)。但是,您的模型应该允许独立于成员将技能置于团队级别。如果你只将SkillA放在TeamA 的技能属性上会发生什么?我认为你应该留下多对多的关系人与技巧团队和个人应派生团队级别的技能属性。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java