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

时间:2008-12-01 23:25:12

标签: java hibernate jpa

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

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

3 个答案:

答案 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方法然后这变得非常有用