当您从多个数据源中提取模型对象时,最好采用什么方法?
例如,我有一个应用程序使用 hibernate 将一些数据存储在 mySQL 数据库中。如果我想在 EC2 或 Google App Engine 中存储一些其他对象怎么办?我知道 DAO 抽象了使用特定数据源的实现,但是实体本身呢?
起初我认为用 jpa 注释来注释我的实体是一个很好的解决方案,但现在看来我真的把我的实体绑定(bind)到一个特定的实现。以 App Engine 为例,其中一些注释毫无意义。
似乎我需要一个纯 POJO 类来表示我的实体,完全没有持久性逻辑。例如,如果我想为一只狗建模(是的,蹩脚的选择,但无论如何)。
有一个抽象的 Dog 类,然后定义子类以使用特定的持久性解决方案是否有意义:HibernateDog、GAEDog 等。
谢谢。
最佳答案
这是一个很好的问题,即使这个问题不是新的。作为一个行业,多年来我们一直在频繁地改变关于这个主题的“传统智慧”。您今天得到的答案不一定是 5 年前或 5 年后的答案。
在描绘我想如何处理这个项目时,我想知道您没有说明的一些事情:您的应用程序是 Dog 实体的“记录系统”吗?其他子系统/层/应用程序需要了解有关 Dog 实体的哪些信息。
在 Java 中,当您编写 Animal > Dog 等全新类型时,您将获得以下奖励:有机会编写更多知道如何与 Animal 对象和 Dog 对象交互的代码。与五年前相比,我在 2010 年不太相信这是个好主意。
您是否负责设计存储狗信息的数据库?我们过去一直这样做,但现在我经常发现自己与其他系统实际管理的数据记录集成:谷歌 API、LDAP 实体、数据仓库、peoplesoft 等产品。
如果您不负责定义狗是什么以及它们如何与宇宙交互,我会考虑一种与领域无关的方法来在内存中对狗信息进行建模。有很多:XML/DOM、JSON、Map 等。
以这些格式移动其他人的数据的优势有很多...
- 您不必编写 POJO
- 这些具有丰富的功能、文档和测试
- 有许多现有的 API 可以转换、操作和序列化这些生物
- 您可能会在其他域中重用您的 View / Controller /其他代码
另一方面...如果您是 Dog 数据的记录系统,请考虑使用接口(interface)而不是抽象类。或者可能接口(interface) 和 抽象类。 Java只有单继承;将您的 View / Controller /其他代码绑定(bind)到接口(interface)以保证最大的 future 灵 active 。
关于java - 是否有模型/实体类的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2097567/