休眠注释 - 哪个更好,字段或属性访问?

2022-08-31 07:32:47

这个问题与休眠注释放置问题有些关系。

但我想知道哪个更好?通过属性访问还是通过字段访问?每种方法的优缺点是什么?


答案 1

两者都有参数,但大多数都源于某些用户要求“如果您需要添加逻辑怎么办”,或者“xxxx中断封装”。然而,没有人真正评论过这个理论,并给出了一个合理论证的论点。

当Hibernate/JPA持久化一个对象时,它实际上在做什么 - 好吧,它正在持久化对象的状态。这意味着以一种易于复制的方式存储它。

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

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

保存对象的内部状态不会破坏封装 - 否则您并不真正了解封装的含义以及它存在的原因。它就像对象序列化一样。

因此,在大多数情况下,保留字段而不是访问器是合适的。这意味着可以从数据库中准确地重新创建对象,就像它存储的那样。它应该不需要任何验证,因为这是在创建时在原始文件上完成的,并且在将其存储在数据库中之前(除非上帝禁止,否则您正在DB!!!!中存储无效数据)。同样,也不需要计算值,因为它们在存储对象之前已经计算过了。对象的外观应与保存之前的外观相同。事实上,通过在 getter/setter 中添加其他内容,你实际上增加了重新创建不是原始副本的东西的风险。

当然,添加此功能是有原因的。可能有一些有效的用例用于持久化访问器,但是,它们通常很少见。例如,您可能希望避免持久化计算值,尽管您可能希望询问为什么不在值的 getter 中按需计算它,或者在 getter 中懒惰地初始化它。就我个人而言,我想不出任何好的用例,这里没有一个答案真正给出“软件工程”的答案。


答案 2

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

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

我相信现场访问是Spring推荐的成语,但我找不到支持这一点的参考。

有一个相关的SO问题试图衡量性能,并得出“没有区别”的结论。


推荐