Hibernate Annotations - 哪个更好,是字段还是属性访问?

问题

这个问题与Hibernate Annotation Placement Question有些相关。

但我想知道哪个是67737030更好**?通过属性访问或通过字段访问?各有哪些优缺点?


#1 热门回答(218 赞)

两者都存在争议,但大多数都源于某些用户要求"如果需要添加逻辑",或"xxxx打破封装"。然而,没有人真正对这一理论发表评论,并给出了一个合理的理由。

什么是Hibernate / JPA在持久化对象时实际做的事情 - 好吧,它是持久化对象的状态。这意味着以一种可以轻松复制的方式存储它。

什么是封装?封装意味着使用接口来封装数据(或状态),应用程序/客户端可以使用该接口安全地访问数据 - 保持数据的一致性和有效性。

把它想象成MS Word。 MS Word在内存中维护文档的模型 - 文档STATE。它提供了一个用户可以用来修改文档的界面 - 一组按钮,工具,键盘命令等。但是,当你选择保留(保存)该文档时,它会保存内部状态,而不是一组按键和鼠标点击用于生成它。

保存对象的内部状态不会破坏封装 - 否则你并不真正理解封装意味着什么,以及它存在的原因。它就像对象序列化一样。

因此,在大多数情况下,坚持FIELDS而不是ACCESSORS是合适的。这意味着可以从数据库中精确地重新创建对象,就像存储它一样。它不应该需要任何验证,因为这是在原始文件创建时,在它存储在数据库之前完成的(除非,上帝禁止,你在DB中存储无效数据!!!!)。同样,不需要计算值,因为它们是在存储对象之前计算的。该对象应该看起来像它保存之前的方式。事实上,通过在getter / setter中添加额外的东西,实际上增加了重新创建不是原始副本的东西的风险。

当然,添加此功能是有原因的。可能存在一些用于持久访问者的有效用例,但是,它们通常很少见。一个例子可能是你想要避免持久计算一个值,尽管你可能想问一个问题,为什么你不在值的getter中按需计算它,或者懒惰地在getter中初始化它。我个人认为没有任何好的用例,这里的答案都没有给出"软件工程"的答案。


#2 热门回答(73 赞)

我更喜欢字段访问,因为这样我就不会被迫为每个属性提供getter / setter。

通过Google进行的快速调查表明,现场访问占多数(例如,http://java.dzone.com/tips/12-feb-jpa-20-why-accesstype)。

我认为现场访问是Spring推荐的习惯用法,但是我无法找到支持它的参考。

有一个试图衡量表现的arelated SO question,并得出结论"没有差别"。


#3 热门回答(35 赞)

这是你必须使用属性访问器的情况。想象一下,你有一个GENERIC抽象类,它具有很多实现优点,可以继承到8个具体的子类:

public abstract class Foo<T extends Bar> {

    T oneThing;
    T anotherThing;

    // getters and setters ommited for brevity

    // Lots and lots of implementation regarding oneThing and anotherThing here
 }

现在究竟该如何注释这个类?答案是你无法使用字段或属性访问来注释它,因为此时你无法指定目标实体。你必须注释具体实现。但由于持久化属性是在这个超类中声明的,因此必须在子类中使用属​​性访问。

在具有抽象通用超类的应用程序中,字段访问不是一个选项。