我正在使用 hibernate 开发一个遗留项目。有时我会发现开发人员在实体对象的 set 方法中编写了额外的代码。我想知道这是否是一种可接受的做法? hibernate 实体对象不应该只是带有额外注释的 pojo 类,也许还有一些 @Transient 辅助方法吗?
如果你想做额外的操作,这不是与实体一起工作的服务/dao 的责任吗?
最佳实践是什么?有谁知道解释这一点的博客或公认的文章吗?
最佳答案
恕我直言,两种方法都是正确的。它们都有其优点和缺点。这关系到永恒Anemic model vs DDD (Domain-driven design) war 。
关于Hibernate,它是相当灵活的。它可以让您采取任何您想要的方法。解决方案的性能和正确性并不取决于您所做的决定,而是取决于查询、数据库索引、实体获取策略、所选算法、I/O 处理、并发实现、事务管理等的正确性。
如果按照 DDD,实体将是业务层的一部分,而 Hibernate 本身(Session、SessionFactory 和整个 ORM)将是持久层的一部分。在这种情况下,实体将包含与持久性相关的注释,这只是 ORM 的提示。
您还应该小心事务管理。这在实体之外可以更好地完成。 (实际上,贫乏模型的一个主要优点是事务管理非常容易,因为您将业务层的每个服务方法包装在事务单元内)。
正如您所提到的,您混合了两种“意识形态”,也许您可以利用这一事实作为优势:让服务方法将逻辑委托(delegate)给域实体,但将事务管理保留在业务服务中。
关于java - hibernate 实体 setter 中的额外操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29007343/