2011-12-28 59 views
5

假設我有一個User實體是這樣的:可以在hbm.xml中映射的屬性是暫態的嗎?

class User { 
    private String login; 
    transient private String hashedPassword; 
} 

我不想永遠傳遞hashedPassword給客戶,所以我讓短暫的。

該類由Hibernate映射,兩個字段映射在hbm.xml中。

此實現是否安全正確? Hibernate會將hashedPassword正確地存儲在數據庫中,將它從數據庫中加載到對象中,並將它保存在複製的二級緩存和本地會話緩存等中?

換句話說,Hibernate或二級緩存是否以任何方式尊重transient或完全忽略它?

編輯:我已經有兩個答案,似乎並沒有包括方程的一個特定方面。我根本沒有使用註釋,只有hbm.xml中的XML映射。並且此Java瞬態字段在hbm.xml中進行了或映射。

回答

3

看起來Hibernate不會在transient關鍵字中保留一個字段,不管其他註釋是什麼。

單獨@Transient註釋可以讓你直接Hibernate來忽略持久性的非瞬時領域,但我不認爲這是可能做到Hibernate來的相反堅持一個transient場。

類似的討論在這裏:

JPA - using annotations in a model

Annotation @Basic to transient variables

通過上面的最相關的報價,從JPA 2.0規範:「映射的註釋不能被應用到字段或那些性質transient@Transient 「。

+0

謝謝,但我特別提到該字段映射在hbm.xml中。我根本沒有起訴註釋。 – 2011-12-28 18:29:08

+0

在這種情況下,Hibernate是否實際映射屬性?我假設annotations和hbm.xml表現相同,但可能情況並非如此。由於'transient'會確保屬性沒有被序列化,你的問題完全是關於Hibernate的行爲嗎? – wrschneider 2011-12-28 18:37:04

7

未映射/瞬態屬性不會通過休眠保存。 Hibernate理解標準Java瞬態修飾符的重要性 - 但也允許您使用@Transient註釋將屬性註釋爲瞬態,如果您願意選擇...或者只是將字段完全保留在映射文件之外。在你的情況下,你可能不需要做任何特別的事情,冬眠應該簡單地「做正確的事情」,通過忽略未映射的字段。

所以: - 如果只是使用的hbm.xml

)未映射屬性不受休眠保存 - 的教訓在這裏他們有效地短暫。

如果使用的POJO

2)Hibernate會忽略減排 「@Transient」 註釋變量:

@Transient 
int ignored=0; 

3)Hibernate會也忽視標準的 「瞬態」 修飾符節約變量:

private transient int ignored =0; 

請參閱http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/對此的一個很好的解釋。

+0

謝謝,但我特別提到該字段映射在hbm.xml中。我根本沒有起訴註釋。 – 2011-12-28 18:29:31

+0

是的,這是真的 - POJO註釋的東西是不相關的。我添加了一個項目符號來解決你的問題。在任何情況下 - 它的簡單,只需將變量從地圖中刪除 - 休眠將看起來是另一種方式。不會進行保存或緩存,因爲對象的hibernate的「映射」將不包含未映射的變量。 – jayunit100 2011-12-28 19:46:19

+0

謝謝傑伊,但我的觀點完全相反。我問是否總是安全,第二個lv緩存和什麼都不是,有一個臨時POJO字段映射到hbm.xml。 – 2011-12-29 15:19:05

0

這是我的想法 - Hibernate只是一種映射技術。當你將一個字段標記爲TRANSIENT時,它不會被java持久化。而且由於它的狀態並沒有持續下去,爲什麼hibernate應該把它保存在二級緩存中呢?所以即使映射hbm文件中的瞬態字段,hibernate也應該沒有問題。

相關問題