8

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

只是好奇这是一个神话还是真的有真相;我个人发现注释字段更具可读性。

4

3 回答 3

9

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

方法总数:6510,平均:217

字段总数:6586,平均:219

在为每个类添加更多属性之后,我可能应该再试一次,但现在差异似乎没有统计学意义。

于 2008-12-02T01:38:40.603 回答
1

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

老实说,我对反射知之甚少,但 getter/setter 应该是直截了当的。实际上,您可以尝试将其中一种方法设置为私有,但我认为它不会起作用,因为它找不到所需的方法。

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

这就是我在文档中看到的全部内容:

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

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

于 2008-12-01T23:39:25.553 回答
0

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

于 2013-03-12T07:57:06.700 回答