您是不是在 POJO 中编写 Hibernate 代码?

Posted

技术标签:

【中文标题】您是不是在 POJO 中编写 Hibernate 代码?【英文标题】:Do you write Hibernate code inside POJOs?您是否在 POJO 中编写 Hibernate 代码? 【发布时间】:2015-04-14 18:31:17 【问题描述】:

我们有一个使用JSPServletHibernate 的网络应用程序。我们得到的设计模式类似于 MVC,这意味着,

JSP -> Servlet -> Beans (POJO)

现在是问题。一旦开发人员在 POJO 中插入了休眠查询、休眠会话创建等。现在在这些 POJO 中,有 getAllEmployees()getAllAgents() 等方法。这使得我们很难更改数据库表(我们手动处理数据库,使用 mysql Workbench)并使用自动工具重新生成POJO,因为这些方法会丢失。

现在有 2 个参数。一个是在 POJO 中维护休眠查询和会话是一项很好的工作,因为它看起来像纯 MVC。另一个参数是将 hibernatre 代码移动到 Servlets 并像 bean 一样调用 POJO,只是为了设置和获取值。

我们以前没有在 Hibernate 中工作过。从以上 2 来看,当涉及到 hibernate 时,编写 hibermnate 代码的首选位置是什么?

最后,请注意我们对 Spring 或其他框架不感兴趣,我们使用纯 JSP 和带有 Hibernate 的 Servlet

【问题讨论】:

DAO 设计模式怎么样? 是的。如果不使用 Spring 或其他 POJO 框架,您将很难实现 @vincent 正确提及的正确 DAO-DTO 设计模式。 根据我的经验,我所看到和所做的是将实体 (POJO) 分开。它们只是与其关联的表的表示形式。然后编写一个单独的“服务”类,对对象执行所有 CRUD。因此,您将拥有List<Agent> agentList = service.fetchAllAgents();,而休眠代码将在fetchAllAgents() 中。或Agent newAgent = service.saveAgent(...);。我相信其他人可以用另一种方式处理它,但我工作过的所有公司都是这样做的。 通常实体bean不包含数据访问的方法,我可以建议你使用其他层的Dao对象来管理tris情况 @Ascalonian:您的意思是将所有数据库代码添加到一个服务类中??那将是巨大的! 【参考方案1】:

很可能,您需要的是另一层抽象。由于您的 pojo 是在新迁移后重新创建的,因此您不应该在其中插入代码(我不同意这种方法,但这只是我的观点 :-))

JSP -> Servlet -> NewLayer -> POJO

我不知道您将业务规则放在哪里,但在这种情况下,它将位于“NewLayer”中,其中包含service 和dao 的“混合”层。

我会推荐这些阅读材料来重新思考你的实际架构:

https://softwareengineering.stackexchange.com/questions/220909/service-layer-vs-dao-why-both

Responsibilities and use of Service and DAO Layers

【讨论】:

以上是关于您是不是在 POJO 中编写 Hibernate 代码?的主要内容,如果未能解决你的问题,请参考以下文章

本机 SQL(用 xml 编写)结果集映射到 POJO(基于注释)

如何以编程方式将“@Cascade”添加到 POJO 字段(Spring mvc + Hibernate)

编写hibernate 操作数据库的dao层简单代码

批量产生ssh2项目中hibernate带注解的pojo类的快捷方法

MyBatis框架

Hibernate SqlResultSetMapping 相同的结果重复而不是唯一