gpt4 book ai didi

java - 使用 JPA 时实现 MVC

转载 作者:行者123 更新时间:2023-12-02 08:37:32 25 4
gpt4 key购买 nike

正如我对 MVC 的理解,模型的逻辑也应该进入模型本身 - 使每个对象成为一个独立的实体。这意味着类的方法必须具有触发器和操作链。例如,通过在 Person 类中使用 setZipCode(zip) 可以触发一个操作,从 zip 到城市表中查找邮政编码,然后设置 setCity(city) 。

这一切看起来都不错,但是当您考虑一些 JPA 实现时会发生什么?在我看来,类的 setter 和 getter 必须清除所有额外的逻辑,因为 JPA 实现使用它们来构建对象。因此你不能在 setZipCode 中调用 setCity 。我们通过将所有特定于模型的逻辑移至 Controller 层来解决了我所参与的一个项目。在这种情况下,我们不会直接调用 Person,而是调用 PersonController.setAddressInfo(zip) 来处理两者,或者类似的东西。也许更好的选择是在实体本身内部拥有执行此操作的 transient 函数。

所以这是我的问题:我是否错过了 MVC 或 JPA 原理中的一些基本原理,或者在使用 ORM 层时 MVC 不能完全实现?如果通用 setter 和 getter 对于 JPA 来说是私有(private)的,并且这些类将为开发人员提供单独的公共(public)、 transient API,会不会更好? (出于某种原因,Hibernate 似乎不介意访问私有(private)方法。)

在我们的项目中使用 Hibernate 的 JPA 实现中,我的同事在另一个项目中使用了 EclipseLink,并且我最近阅读了一些有关 OpenJPA 的内容。

最佳答案

我的经验是,您可能需要在实际的 JPA 域对象和 MVC 框架 Controller 之间添加另一层。有关 JPA 的文献将它们称为数据访问对象 (DAO) 理想情况下,JPA 业务对象只是 POJO(普通旧 Java 对象),具有没有任何逻辑的 getter 和 setter,并且 DAO 实现类似

的操作
List<Post> PostDao::searchPostsByDate(Date d);
void PostDao::save(Post p);

我使用的架构甚至在 DAO 层之上还有另一个服务层,其中 DAO 特定于一个域模型实体,服务类执行事务管理并调用相应的 DAO 方法。这些服务可以与多个 DAO 交互,以便该服务可以提供类似的方法

City MainService::getCityByZipCode(ZipCode zc);

我个人认为,当您例如在 DAO 中使用 Springs @Transactional 注释并提供适当的方法,例如

@Transactional
City ZipCodeDAO::getCity(ZipCode z);

关于java - 使用 JPA 时实现 MVC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1091072/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com