2012-05-31 48 views
0

我讀JPA 2.0序列化時,從一個虛擬機到另一個意思。我遇到一個句子什麼是使用JPA

We have used the transient modifier instead of the @Transient annotation so that 
if the Employee gets serialized from one VM to another then the translated name 
will get reinitialized to correspond to the locale of the new VM. 

@Entity 
public class Employee { 
    @Id private int id; 
    private String name; 
    private long salary; 
    transient private String translatedName; 
    // ... 
    public String toString() { 
     if (translatedName == null) { 
      translatedName = ResourceBundle.getBundle("EmpResources").getString("Employee"); 
     } 
     return translatedName + ": " + id + " " + name; 
    } 
} 

我的理解是什麼,當我們使用@Entity註釋和容器遇到它,然後它調用JPA提供商做的事情。像數據庫中的地圖ID到ID列一樣。儘管我們沒有在名稱和薪水中提到@Column註釋,但是默認情況下它將映射到數據庫中的NAME和SALARY列。我們在compiledName上使用了transient,所以JAP保持原樣,而不是映射應用於它。這只是這個班的一個領域。但我無法理解這句話

if the Employee gets serialized from one VM to another 

有人請給我解釋一下嗎?還請告訴我,上面關於JAP工作流程的定義是正確的?就像容器遇到@Entity註釋時發生的情況一樣?

由於

回答

2

當一個類實現java.io.Serializable接口,這個類的實例是可序列化。這意味着JVM可以將對象轉換爲一系列字節。這些字節可以通過網絡發送,也可以保存在磁盤上,可以被另一臺虛擬機讀取並轉換回Java對象。

如果一個字段有transient Java的關鍵字,就意味着這個領域將這個序列化機制被忽略。該字段不會被序列化。

@Transient註釋的字段被認爲是由JPA非持久字段。它不會將它保存在數據庫中,也不會從數據庫中加載它。但是如果對象被髮送到另一個JVM,它將被序列化。

Java的transient關鍵字自動使場@Transient。這意味着transient字段不會被序列化,也不會被JPA保存。

+0

Hhhhmm謝謝。你的意思是,如果我使用'@ Transient' annotaion,那麼這個字段的數據將不會保存在數據庫中,但是如果我的Employee calss實現Serializable接口,它將會被序列化。但是對於transient關鍵字,即使我的Employee類實現Serializable,既不保存到數據庫也不能成爲serializabe?我對嗎? – Basit

+0

你說得對。 –

+0

謝謝:)當我們說堅持實體時,還有一件事,它意味着將記錄保存在數據庫中。如果記錄不保存在數據庫中,那麼我們不能說它會持續存在? – Basit

0

在「JEE5世界」,您可以使用分離的實體,你將不得不使用傳輸對象。 (我不判斷這是不是一個好主意!)

因此,您可以調用例如一個服務方法(例如EJB 3 SLSB方法),該方法使用通常的遠程調用語義序列化。

應當注意的是,如果員工的實例已成功序列化,那麼你的Java運行時可能會被打破,因爲類不實現Serializable。

0

如果您不想將實體arrtibute的狀態保存到數據庫,也不想將狀態轉移到另一個jvm,請使用Transient關鍵字。

如果您不想將實體arrtibute的狀態保存到數據庫,但希望將狀態轉移到另一個jvm,請使用@Transient註釋。