Hibernate / JPA中注释字段或getter方法之间的性能差异

我很好奇是否有任何人在使用私有字段而不是公共getter方法注释实体之间的性能差异方面有任何硬数据。 我听说过人们说字段较慢,因为它们被称为“通过reflection”,但是再次使用getter方法,不是吗? Hibernate需要在尝试读取字段之前将字段的可访问性设置为true,我可以看到它有一些轻微的开销。 但是,这不会在会话范围内的类级别完成,或者可能只在读取配置并构建SessionFactory时才执行一次?

只是好奇这是否是一个神话,或者它是否真的存在真相; 我个人觉得这些字段的注释更具可读性。

将5000条记录加载到一个简单的3列表中。 将两个类映射到该表,一个使用带注释的私有字段,另一个使用带注释的公共getter。 运行Spring的HibernateTemplate.loadAll(),然后使用HibernateTemplate.clear()来清除会话缓存。 结果以毫秒为单位……

方法总数:6510,平均值:217

总计:6586,平均:219

在为每个类添加更多属性之后,我应该再对它进行另一次尝试,但是现在差异似乎没有统计意义。

好吧,我不能给数字哈哈,但我猜想通过reflection访问这些字段不会是“一次性”的事情。 每个对象都有自己的私有成员。

老实说,我对reflection知之甚少,但吸气/安装者应该是直截了当的。 事实上,您可以尝试将其中一个方法设置为私有,我认为它无法正常工作,因为它无法找到所需的方法。

还有其他问题,如代理会影响getter方法,具体取决于您加载实体的方式。

这就是我在文档中看到的所有内容:

access属性允许您控制Hibernate在运行时访问属性的方式。 默认情况下,Hibernate将调用属性get / set对。 如果指定access =“field”,Hibernate将绕过get / set对并使用reflection直接访问该字段。 您可以通过命名实现接口org.hibernate.property.PropertyAccessor的类来指定您自己的属性访问策略。

我的猜测是,reflection一般来说会是一个更高的成本,但抱歉..没有数字:(

通常在getter方法的上面使用注释,因为当在JVM中加载类时,hibernate模型或实体类也被加载,那么如果你使用字段或peroperty之上的注释,那么它将在每个请求时只执行一次。 然而,如果你放置在getter之上然后在reflaction或任何其他层,当它将cale这个类,然后调用getter方法然后这变得非常有用