【问题标题】:Java JPA/Hibernate anti-patternJava JPA/Hibernate 反模式
【发布时间】:2014-11-30 20:26:16
【问题描述】:

我使用 JPA/Hibernate 已经有几年了,它们真的很有用。但我对设计有一些哲学问题。

主要问题是我为什么要公开我的所有类属性(创建公共 setter/getter)只是因为 Hibernate 想要访问它们,即使它可以在没有此权限(通过反射)的情况下访问它们,并且在这个设计中 getter 和 setter应该如此简单以减少开销,然后实际上他们失去了控制对字段的访问的存在哲学。即在这个设计中,getter 和 setter 在需要不同设计标准的数据库访问(JPA)和系统域之间共享。 (当您从数据库加载某个值时,您可能不需要在将其设置为字段之前对其进行检查,因为您之前已经完成了此检查!)

任何机构都可以解释这种设计的任何原因吗?我知道它在某些情况下很有帮助,但在大多数情况下却没有。!

还有一个问题是,当从数据库加载对象时,setter 几乎没用,因为对象已部分加载并且没有顺序(因此它几乎迫使我们实现如此简单的 setter,只是从输入文件)!

【问题讨论】:

  • 据我所知,Hibernate 使用的 getter/setters/constructors 只能是私有的!
  • 无法读取/写入的数据库列的用途是什么?
  • @JohnAment in Object Oriented Programming 一个对象可以拥有自己的一些内部数据,这些数据应该只由该对象管理,其他人不应该访问这些对象!
  • @geert3 谢谢。但你错了!
  • @hasan 我不这么认为。来自 Hibernate 文档:Hibernate can access public, private, and protected accessor methods, as well as public, private and protected fields directly. The choice is up to you and you can match it to fit your application design. 请参阅 docs.jboss.org/hibernate/orm/3.3/reference/en/html/…

标签: java hibernate jpa design-patterns


【解决方案1】:

如果您的 setter 仅供 Hibernate 使用,您可以将其设为私有。 来自hibernate documentation

Hibernate 可以访问公共、私有和受保护的访问器方法, 以及直接公开、私有和受保护的字段。选择 取决于您,您可以匹配它以适合您的应用程序设计。

无参数构造函数是所有持久化的要求 课程; Hibernate 必须使用 Java 为您创建对象 反射。构造函数可以是私有的,但是包或公共的 运行时代理生成和高效数据需要可见性 无需字节码检测即可检索。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    • 1970-01-01
    • 2017-01-07
    • 2016-06-17
    • 1970-01-01
    相关资源
    最近更新 更多