晚安,哈伯。
本文旨在帮助寻找从休眠状态开始并面临与我相同的问题(即,
如何在此工具上正确书写)的人们 。 (这对于使用弱类型语言来使用Java的程序员特别有用)。 没有代码,也没有关于如何有效使用该技术的基本原则。 删节后写的所有内容都是我的恕我直言,并不是要求解决该问题的唯一方法。
所以
立即保留我在
Spring Data JPA方面的经验。
由于Hibernate是企业框架,因此很难在其中找到比常规CRUD更深的代码示例。 这个事实使对如何使用Hiber进行编写,框架的开发人员如何想象好的代码的理解严重复杂化,结果,我不得不自己考虑这个问题。 我确定我并不孤单。
@
您可以注意到的第一件事是没有数据库作为抽象。 在休眠状态下,已完成所有操作以完全控制代码中的数据库(您可以google Entity Management)。 数据库是执行几乎愚蠢的存储功能的域对象。 因此,一个重要的规则是:除了存储,不要将它们用于其他任何用途。 它们不应执行接受用户输入的DTO的功能,并且不应在序列化过程中用作显示器。 他们有爪子。
难以置信但真实通常,令人惊讶的是,我没有在Internet的教育领域(包括英语)中看到使用其他类进行序列化的示例(例如,在json中)。 谁曾说过,如果您拥有REST服务,那么您就不必担心显示类了吗?)
是的,对于REST而言并非如此,直觉表明,以一种良好的语气,它将在仅准备好所有数据的情况下仅向客户端提供所需的数据集(而不必为延迟初始化而在客户端上调用getter)。
@
这意味着遵循以下规则-他们不应该在意使用的格式。 我们是否需要产品列表(仅包含名称和描述)或产品页面(包含照片和评论)-在一种情况下,客户端将收到来自
SimpleProductViewer (id, name, description)
的
List
SimpleProductViewer (id, name, description)
,以及另一个
ExtendedProductViewer (id, name, description, List(photos), List(reviews), rating)
,它们将在
ProductService
类的方法中生成,并且
仅将域类用作数据源。
输入也是一样。 这是Java,在每种情况下都可以在不同的字段中进行DTO :)
举例来说,我将增加hackeded Product域的类库。 我们已经拥有的:
- 产品(域)
- 查看器(用于客户端信息显示的类,可以是任何数字)
- Dto(获取信息的类也可以是任意数量)
- 存储库(用于接收数据)
- 服务(或管理器)-一个不受控制的业务逻辑的黑匣子,它结合了之前的所有要点。
@
在我看来(似乎)Java Enterprise并不是非常优化的(可以在休眠状态下请求,并且OOP(休眠)已经接管了管理数据库实体的事实就可以看出这一点)。 因此,我认为在这种情况下,最主要的是代码符合框架开发人员的想法,而不是最佳策略。
@
如果您以这种方式查看休眠域(仅用于数据存储),
@ManyToOne
似乎是一种不常用的机制,仅适用于完全依赖的表-图像,评论,注释。 原则上,这是正常的-在我看来,没有必要将其作用扩展到数据库的核心表。
总结
- 仅将域用于数据存储,希望类属性包含在目标数据库表中,也就是说,没有多余的东西(由业务逻辑决定)。
- 无需尝试扩展域-扩展显示类,并仅将域类用作数据提供者。
- 不要害怕产生相同类型的类-理解性和使用灵活性更为重要。 减少代码量的最大办法是从域继承它们。
- 不要追求优化。 对于Java男孩来说,这并不重要,尽管当然,这完全取决于上下文。
这样的东西。