【问题标题】:Hibernate: Best way to configure 3-way many to many relationshipHibernate:配置三向多对多关系的最佳方式
【发布时间】:2012-07-24 19:58:59
【问题描述】:

我正在尝试找出在 Hibernate 中映射三向 @ManyToMany 关系的最佳方法。以下是我的数据模型:

如您所见,TeamPosition 表只不过是 3 个外键。 Hibernate 以两个表之间的多对多映射的形式提供了有用的功能,并且在不需要创建第三个 Hibernate 实体的情况下连接它们的映射表。当然,如果该映射表有其他数据,例如“StartDate”、“EndDate”,那么无论如何都需要为映射表创建实体。

是否可以在每个实体上为其他两个实体创建两个 ManyToMany 映射,或者如果我创建一个 TeamPosition 实体并与之建立 OneToMany 关系,是否会更简单、更痛苦?

我不一定认为有错误的答案,但有些答案可能比其他答案更正确。

【问题讨论】:

    标签: hibernate hibernate-mapping


    【解决方案1】:

    有趣的问题!

    为了清楚起见:这部分数据库是否记录了特定球队在特定赛季所在的联赛组?这里的“联盟组”是什么意思?比如,the premier league vs the championship vs league one?在给定的赛季中,一个给定的联赛组中可以有几支球队吗?

    我怀疑让TeamPosition 成为一个实体将是最不痛苦的事情。关系都是一对多的,你可以使用它对TeamSeason的外键来构造一个复合主键,这样可以避免给表一个冗余的代理键。通过表连接的查询必须明确命名,但相当简单。

    不过,您也可以尝试将其建模为地图。看起来像:

    public class Team {
        @ManyToMany
        private Map<Season, LeagueGroup> positions;
    }
    

    无法保证安全。我以前只做过一次。如果你从上面生成 SQL(在我的例子中使用 Hibernate 的模式生成器),你会得到以下连接表(我给了我的实体整数键):

    create table Team_LeagueGroup (
        Team_id integer not null,
        positions_id integer not null,
        positions_KEY integer not null,
        primary key (Team_id, positions_KEY)
    );
    

    使用以下外键使其更清晰:

    alter table Team_LeagueGroup 
        add constraint FKE143A2AEB84635C9 
        foreign key (Team_id) 
        references Team;
    
    alter table Team_LeagueGroup 
        add constraint FKE143A2AEB7412E91 
        foreign key (positions_id) 
        references LeagueGroup;
    
    alter table Team_LeagueGroup 
        add constraint FKE143A2AE8F6AD5C 
        foreign key (positions_KEY) 
        references Season;
    

    看起来差不多。您可以使用常用的注释来自定义您认为合适的表和列名称。

    现在,这避免了为连接表创建实体的需要,但它还有一些不足之处。首先,我不知道用于连接的 JPQL 语法是什么。它会在文档中,但你肯定会得到你的童子军徽章来探索规范的晦涩角落以找到它。其次,我不认为有任何方法可以为此设置反向映射。问题在于,尽管球队和赛季的组合唯一地标识了一个联赛组,但这对于这三对中的其他组合来说并非如此。一个给定的球队可能在几个赛季中都在一个给定的联赛组中,并且在一个给定的赛季中的一个给定的联赛组将包含几支球队。反向关系需要看起来像class LeagueGroup { Map&lt;Season, Set&lt;Team&gt;&gt; teams; },我认为这超出了 JPA 的能力(尽管我可能错了)。

    【讨论】:

    • 感谢您的洞察力,我绝对可以看到尝试进行反向查找会变得很麻烦,所以我个人觉得您的建议并不理想,但这肯定是我还没有想到的.我会等着看其他人是否以不同的可能性回答,如果没有,我想我会创建一个具有 OneToMany 关系的 TeamPosition 实体。
    猜你喜欢
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-25
    • 2020-11-20
    • 2013-05-27
    • 2015-08-19
    • 2018-03-28
    相关资源
    最近更新 更多