【问题标题】:Is it OK to have only bidirectional relationships with Hibernate?是否可以只与 Hibernate 建立双向关系?
【发布时间】:2011-06-09 08:22:45
【问题描述】:

所以问题几乎就在标题中。

假设我有一些类:用户、帖子、评论和标签。

  • 用户有一个@OneToMany 列表和 @OneToMany 列表。
  • 帖子有 @ManyToOne 用户,@OneToMany 列表,@ManyToMany 列表。
  • 评论有@ManyToOne 列表, @ManyToOne 用户。
  • 标签有@ManyToMany 列表。

我是 Hibernate 的新手,但我发现使用例如 Tag 对象的属性来获取与该标签相关的所有 Post 对象,或者查找 Post 对象的作者或所有 Post 编写的对象很容易由某个用户。

可以吗?

我在这里更多地谈论性能。我也在用Play!框架。我不知道这是否会改变什么。

【问题讨论】:

    标签: java hibernate playframework


    【解决方案1】:

    可以有双向关系。真正的危险还在于lazy false,因为这样您最终会为每个请求将大量数据库加载到内存中。

    如果您有双向关系,最好创建特定的 dao 方法,允许您使用 hql 仅加载您需要的数据。

    【讨论】:

    • 感谢您的回答。你能解释一下什么是懒惰的假吗?
    • 哦,我想我明白了。懒惰的意思是当你想访问数据时它只会从数据库中获取数据?当它关闭时,Hibernate 将获取它需要的所有数据,所以通过双向关系,你最终会像你说的那样加载大量内存?假设开启了,那么就OK了?
    • 你明白了。在我的答案中添加了另一个句子。
    【解决方案2】:

    我认为其中一些应该是单向的。

    例如,在实际场景中,您通常不需要显示“all Posts by User”,因为它们应该被过滤或分页,因此您需要对数据库运行查询而不是从User 检索Posts(因为在这些用例中不过滤数据库端的集合可能是一个真正的性能问题,特别是如果该集合很大)。

    因此在User 中收集Posts 是没有意义的。 User - CommentTag - Post 关系也是如此。

    【讨论】:

    • 那么我该怎么办我想要一个包含所有带有特定标签的帖子的页面?
    • @Marc:执行SELECT p FROM Posts p WHERE :tag is member of p.tags 之类的查询。不要忘记申请setFirstResult/setMaxResults,因为如果您的数据库很大,您肯定不想看到包含所有匹配帖子的页面。
    • 但是如果我能做到,例如aTagObject.getPosts(),那又有什么意义呢。这是因为我无法设置setFirstResultsetMaxResults
    • @Marc:是的。如果您有许多带有特定标签的Posts,则无需一次显示所有这些。如果你有很多Posts,将它们全部加载到内存中会导致性能问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    相关资源
    最近更新 更多