【问题标题】:Java DAOs, Entities, Factories, what goes where?Java DAO、实体、工厂,什么去哪儿了?
【发布时间】:2014-09-10 18:12:22
【问题描述】:

我有一个 Tomcat 应用程序,它使用从 Eclipse/JPA 自动生成的实体。然后,我手动编写了与数据库接口的 DAO。

我看到保持实体简单的显着好处。例如规范说它必须有一个空白的构造函数。不理会它们意味着如果数据库架构发生更改,我可以重新生成它们。但我很想扩展它们。

几个问题...

如果我创建一个新实体,我希望某些字段具有非空值。如果我有一个空的构造函数,我不能在那里做。例如status='New', Date created = new Date() etc.

我意识到我可以使用工厂。但是,那应该在 DAO 内部说吗?例如DAO.getNewObject()?

同样,如果我想使用测试或验证逻辑,那该去哪里?例如完整性分数 = 如果填写姓名、地址、电话等?这种东西应该存在于 DAO 中吗?还是实体?或者是其他东西?

我是否应该有一个扩展实体并将逻辑放入其中的新类?

在某处是否涵盖了思考类的建筑材料?

【问题讨论】:

  • 是的。但我没有使用它们来构建它。而且我不会在中途切换......
  • > 如果数据库架构发生变化,我可以重新生成它们。

标签: java jpa


【解决方案1】:
  1. 对于 NotNull、MinLength 等验证,请考虑使用 a suitable JSR303 compatible validator
  2. 对于某些业务验证,有两种方法:使用单独的验证器类或在对象本身中进行验证。我有时会在对象本身中进行独立验证。但是如果代码变得更大,那么最好将验证分离/解耦到验证器中。 (Spring 可以帮助您将分离的验证器与服务绑定。)但是,我不建议在 DAO 中使用验证逻辑。数据访问对象应该用于访问数据。假设您的数据库包含经过验证的数据,则可以在更高级别执行验证。您可以将对象传递给验证器方法,而不是扩展任何东西。
  3. 扩展实体类的验证器类不是一个好主意。
  4. 您应该在哪里验证对象? IMO 您可以验证对象或数据何时跨越边界传递。尤其是从请求数据(控制器层)创建对象时。此外,当对象可变时验证或制作防御性副本。
  5. 正如 Nathan 提到的,时区(以及货币、字符编码等)问题可能很棘手。所以得出一个标准。这将有助于最大限度地减少验证和转换。

【讨论】:

    猜你喜欢
    • 2011-04-10
    • 2010-10-13
    • 2013-05-26
    • 2011-10-04
    • 1970-01-01
    • 2011-03-03
    • 2014-03-15
    • 2015-07-17
    • 2012-10-30
    相关资源
    最近更新 更多