java - hibernate 实体 setter 中的额外操作

标签 java hibernate

我正在使用 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/

相关文章:

java - 是否可以使用 Hibernate 标准获取 Order 的连接表的 SQL 别名?

hibernate - 使用 Hibernate Envers 进行 Spring Data JPA 和 Spring Boot 审计

java.lang.UnsatisfiedLinkError 和 ADB 中的未知错误

java - 基于事件的每个记录器的 Log4j 过滤

java - 使用 <Void> 类型使参数可选?

java - 无法在java中的数据库中保存日历数据

java - Spring Hibernate,尝试获取实体时堆栈溢出

java - 在忽略 Object.toString() 的同时在 Eclipse 中查找 MyClass.toString() 的引用

amazon-web-services - curl : (35) Cannot communicate securely with peer: no common encryption algorithm(s)

java - 在 Play 框架中使用 ElementCollection 时出现 LazyInitializationException