2008-12-01 44 views
7

我很好奇,如果任何人都有使用私有字段而不是公共getter方法註釋實體之間的性能差異的任何硬數字。我聽說有人說字段比較慢,因爲它們被稱爲「通過反射」,但是再一次,getter方法也是如此,不是嗎?休眠需要設置字段的可訪問性爲真,然後它會嘗試讀取它,我可以看到有一些輕微的開銷。但是,這不是在會話範圍內的Class級別完成的,或者可能只有在Configuration被讀取並構建SessionFactory時才執行?Hibernate/JPA中的註釋字段或getter方法之間的性能差異

只是好奇,如果這是一個神話或如果真的有真相;我個人發現註釋的字段更具可讀性。

回答

8

加載5000條記錄成一個簡單的3列的表。映射兩班到該表,其中一個使用帶註釋的私有字段,另一個使用帶註釋的公共getter。使用Spring的HibernateTemplate.loadAll()運行30次,之後是HibernateTemplate.clear()以清除會話緩存。 :6510,平均值:217

田地總數:6586,平均值:219

在爲每個班級添加更多屬性之後,我應該再試一次,但現在差異似乎沒有統計學意義。

0

好吧,我不能給數字哈哈,但我想通過反射訪問字段不會是'一次'的事情。每個對象都有自己的私有成員。

老實說,我不太瞭解反射,但吸氣/定位者應該是直截了當的。事實上,您可以嘗試將其中一種方法設置爲「私有」,我認爲它不起作用,因爲它找不到所需的方法。

還有其他問題,如代理將影響getter方法,雖然取決於如何加載您的實體。

這是我的文檔中看到:

訪問屬性可以讓你控制 Hibernate如何在運行時訪問屬性 。默認情況下,Hibernate將 調用屬性get/set對。如果 指定access =「field」,休眠將跳過get/set對,並使用反射直接訪問 字段。您 可以通過命名 實現接口 org.hibernate.property.PropertyAccessor的類來指定您自己的策略 屬性訪問。

我的猜測是一般性反射將是更高的成本,雖然,但抱歉..沒有號碼:(

+1

get/set方法還需要通過反射來調用。編譯時沒有辦法讓Hibernate知道它需要在類上調用哪些get/set對。我關於設置可訪問性的觀點是它在java.lang.reflect.Field實例的Class級別上完成... – 2008-12-01 23:46:26

+0

ahh是的,我想這很有意義,因爲它必須查找實際名稱。 – 2008-12-01 23:57:45

+0

@ cliff.meyers它總是編譯時間.... Hibernate使用類生成,AFAIK將一個輔助類放入實體包中,因此除了`private`成員(包私有就好)以外,它不需要反射。 – maaartinus 2015-08-07 21:48:13

0

一般在getter方法的上面使用註解,因爲當在JVM ath中加載類的時候,hibernate模型或者實體類也被加載,那麼如果你在字段或者屬性上面使用註釋,那麼它每次只會執行一次請求。而如果你將getter放置在reflaction或任何其他圖層上面,那麼它將調用此類,然後調用getter方法,這會變得非常有用。

相關問題