【问题标题】:Database relationships design JPA [closed]数据库关系设计 JPA [关闭]
【发布时间】:2017-11-21 17:52:36
【问题描述】:

我一直想知道如何在我的应用程序中设计实体之间的关系,我对此有点陌生。你能帮忙吗?

什么应用程序? - 上下文

我正在尝试开发一个应用程序来帮助人们跟踪他们的开支、计算统计数据等,作为一个业余项目来训练我在全栈开发方面的低技能。这个想法是用户登录并可以添加费用,例如以 3 美元购买的鸡,应用程序将根据重复输入计算他的费用统计信息。

我需要了解什么?

我已经完成了用户注册和登录,现在正在创建“SingleExpense”实体类。我想知道在这个特定的用例中,费用和用户之间的关系应该是怎样的。

  • 用户是否应该将一组费用作为带有@OneToMany 注释的字段?但是每当我获取用户时,我将永远得到他的所有费用,对吗?我可能会懒惰地使用 FetchType 或其他方法,但我正在寻找最干净、正确的解决方案。
  • Expense 是否应该将 User 作为带有 @ManyToOne 注释的字段?但是,如果我尝试获取所有费用,用户对象将被获取,对吗?如果我想坚持一个新的费用,我需要将整个用户对象放入费用中,是吗?
  • 或者由于某种原因它应该是双向的?

我对此感到非常困惑,我希望你们能尝试向我解释什么有效,什么无效以及为什么。非常感谢!干杯!

【问题讨论】:

    标签: database jpa relationship


    【解决方案1】:

    由于您解释的原因,您可能不应该有 OneToMany,因为加载给定用户的所有费用可能永远不是一个好主意。即使某些用例需要这样做,一个简单的 JPQL 查询也可以做到。

    所以剩下的第二个选项是正确的。 ManyToOne 也可以是懒惰的。因此,除非您开始使用expense.getUser() 返回的值,否则获取费用不会获取用户。关于新费用的存储:

    • 从数据库中加载用户,使用EntityManager.find() 将其存储在新费用中并不是什么大问题:通过实体 ID 加载实体非常快
    • 但即便如此,如果您认为用户存在,您实际上并不需要从数据库中加载该用户:您只需要获取对该用户的惰性引用,您可以通过EntityManager.getReference() 获得该引用

    【讨论】:

    • 谢谢!我就是这么做的!
    猜你喜欢
    • 2010-09-13
    • 1970-01-01
    • 2012-09-23
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    • 2018-05-02
    • 2010-11-14
    相关资源
    最近更新 更多