我很好奇是否有任何人在使用私有字段而不是公共getter方法注释实体之间的性能差异方面有任何硬数据。我听说过人们说字段较慢,因为它们被称为“通过反射”,但是再次使用getter方法,不是吗? Hibernate需要在尝试读取字段之前将字段的可访问性设置为true,我可以看到它有一些轻微的开销。但是,不会在会话范围内的类级别上完成,或者在读取配置并构建SessionFactory时可能只执行一次?
只是好奇这是否是一个神话,或者它是否真的存在真相;我个人觉得这些字段的注释更具可读性。
答案 0 :(得分:9)
将5000条记录加载到一个简单的3列表中。将两个类映射到该表,一个使用带注释的私有字段,另一个使用带注释的公共getter。运行Spring的HibernateTemplate.loadAll(),然后使用HibernateTemplate.clear()来清除会话缓存。结果以ms为单位......
方法总计:6510,平均值:217
字段总数:6586,平均值:219
我应该在为每个类添加更多属性之后再尝试一下,但是现在差异似乎没有统计意义。
答案 1 :(得分:1)
老实说,我对反射知之甚少,但吸气/定位器应该是直截了当的。事实上,您可以尝试将其中一种方法设置为私有,我认为它无法正常工作,因为它无法找到所需的方法。
还有其他问题,如代理会影响getter方法,具体取决于您加载实体的方式。
这就是我在文档中看到的所有内容:
访问属性可让您控制 Hibernate将如何访问该属性 在运行时。默认情况下,Hibernate会 调用属性get / set对。如果你 指定access =“field”,Hibernate会 绕过get / set对并访问 直接使用反射场。您 可以指定自己的策略 通过命名一个类来进行属性访问 实现接口 org.hibernate.property.PropertyAccessor。
我的猜测是,一般情况下反射成本会更高,但对不起..没有数字:(
答案 2 :(得分:0)
通常在getter方法的上面使用注释,因为当在JVM中加载类时,hibernate模型或实体类也被加载,那么如果你使用字段或peroperty之上的注释,那么它将在每个请求时只执行一次。然而,如果你放置在getter之上,然后在reflaction或任何其他层,当它将cale这个类,然后调用getter方法然后这变得非常有用