2011-04-19 41 views
2

在很多來源中,我讀過PrimaryKey類,甚至JPA2實體都應該是可序列化的。爲什麼JPA-2.0主鍵類必須實現Serializable,但我的示例沒有使用?

在我的例子(傳統數據庫)有僱員和語言之間的關係:

Employee類:

@Entity 
@IdClass(EmpleadoId.class) 
@Table(name = "NO_INFGRAEMPL") 
public class Empleado {  

    @Id 
    @Column(name = "IGECOMPANIA", unique = true) 
    private String compania; 

    @Id 
    @Column(name = "IGENUMEROIDENTIFIC", unique = true) 
    private String numeroIdentificacion; 

//... 
} 

僱員化合物的PrimaryKey類別:

public class EmpleadoId { 

    private String compania; 
    private String numeroIdentificacion; 
    //...   
} 

員工語言技能類:

@Entity 
@IdClass(IdiomaEmpleadoId.class) 
@Table(name = "NO_IDIOMEMPLE") 
public class IdiomaEmpleado { 

    @Id 
    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumns(value = { 
     @JoinColumn(name= "IEMCOMPANIA", referencedColumnName = "IGECOMPANIA"), 
     @JoinColumn(name = "IEMEMPLEADO", referencedColumnName = "IGENUMEROIDENTIFIC") 
     }) 
    private Empleado empleado; 

    @Id 
    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "IEMIDIOMA") 
    private Idioma idioma; 

    @Column(name = "IEMNIVELLECTURA") 
    private String nivelLectura; 
//... 
} 

員工語言技能複合的PrimaryKey類:

public class IdiomaEmpleadoId { 

    private EmpleadoId empleado; 
    private String idioma;  

    //...  
} 

語言類:

@Entity 
@Table(name = "NO_IDIOMAS")  
public class Idioma { 

    @Id 
    @Column(name = "IDICODIGO") 
    private String codigo; 

    @Column(name = "IDIDESCRIPCION") 
    private String descripcion; 

//... 
} 

我使用的EclipseLink JPA2提供下一個J2SE應用程序,它不給我任何異常。

我的問題是:

  • 爲什麼不給我例外?是否強制使用Serializable?
  • 以這種方式繼續安全嗎?還是我應該明確實現可序列化?
  • 在哪些?,JPA2實體或PrimaryKey類?

非常感謝您的幫助。

回答

4

JPA說明書包含這樣的要求(JSR-317 secion 2.4主鍵和實體身份):

主鍵類必須是可序列。

如果EclipseLink確實不強制執行此要求,那麼這是EclipseLink的實現細節,我不建議您依賴它。

不過,也有實體上的串行性沒有要求,除下列一個看起來更像是一個比一個要求的建議:

如果一個實體的實例是按值傳遞作爲分離對象(例如,通過遠程接口),實體類必須實現Serializable接口。

+0

+1。我從來不明白爲什麼這是必需的。 – Bozho 2011-04-19 19:51:53

1

什麼都不需要是可序列化的,但它似乎是由主鍵的規格(10x到axtavt)所要求的,儘管沒有直接需要它。

如果對象通過線路傳輸或持久化到磁盤,則需要序列化,因此我無法看到決定背後的原因。但是,你應該遵守它。

0

主鍵類必須實現可序列化和複合ID類必須實現可序列化是兩個不同的問題。 我會回答你們倆,並希望它能幫助你全面地區分和理解。

  1. 主鍵類必須實現Serializable接口 注:可以毫不其iplementation工作也。 JPA規範包含這樣的要求(JSR-317部分2.4主鍵和實體標識):

    主鍵類必須是可序列化的。

    然而,存在關於實體的串行性沒有要求,所以它不是一項要求 例外的建議: 如果一個實體實例是由值傳遞作爲分離對象(例如,通過遠程接口),則實體類必須實現Serializable接口。

  2. Composite-ID類必須實現可串行化。 該id用作索引會話中加載對象的鍵。 會話對象需要可序列化,因此它所引用的所有對象也必須可序列化。 在CompositeIds的情況下,類本身被用作id。

相關問題