栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在JPA / Hibernate中建立一对多关系模型

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在JPA / Hibernate中建立一对多关系模型

我希望有人能提出一个很棒的解决方案,但是这是一个棘手的情况,我从未能找到一种很好的映射方法。您的选择包括:

  1. 更改关系建模的方式。例如,您可能会遇到以下情况:
    @Entity

    public class GameMembership {
    Team team;
    Game game;
    int gamePosition; // If tracking Team 1 vs Team 2 matters to you
    }


然后

Game
有一个
Collection<GameMembership>
,即您将其建模为多对多。
Game
仍然可以使用方便的方法来设置团队1和团队2,等等(业务逻辑来强制只有2个团队,但是已经完成了),但是它们映射回
Collection
了Hibernate所使用的。

  1. 放弃建立双向关系-选择一个方向(
    Game
    Team
    似乎最合适),然后仅打na该关系。找到所涉及的
    Games
    a
    Team
    然后就可以从您的DAO等中进行操作,而不是从其
    Team
    本身可以访问的内容中进行操作:
    public class GameDAO {....public Collection<Game> gamesForTeam(Team t) {     ....     Query q = session.createQuery("FROM Game WHERe team1 = :team OR team2 = :team");     q.setParameter("team", t);     return q.list();}

    }

或类似的东西

  1. 继续沿您所走的路线行驶,但最后会“作弊”
    Team
    Game
    侧面的属性应映射为正常的多对一关系;然后
    mappedBy
    Team
    末尾用来表示
    Game
    “控制”关系。
    public class Team {    ...    @oneToMany(mappedBy="team1")    private Set<Game> team1Games;    @oneToMany(mappedBy="team2")    private Set<Game> team2Games;

有一个简便属性为您的API(

team1Games
team2Games
只是对Hibernate的使用):

        @Transient    public Set<Game> getGames() {        Set<Game> allGames = new HashSet<Game>(team1Games);        allGames.addAll(team2Games);        // Or use google-collections Sets.union() for bonus points        return allGames;    }

因此对于您的班级的调用者来说,有2个属性是透明的。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/436032.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号