为什么JPA-2.0主键类必须实现Serializable,但我的例子没有?

时间:2011-04-19 15:42:39

标签: persistence jpa-2.0 java

在许多来源中,我已阅读了PrimaryKey Classes,甚至JPA2实体也应该是可序列化的。

在我的示例(遗留数据库)中,员工和语言之间存在关系:

员工类:

@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;

//...
}

Employee Compound PrimaryKey Class:

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;

//...
}

我在J2SE应用程序下使用EclipseLink JPA2 Provider,它没有给我任何例外。

我的问题是:

  • 为什么不给我例外?是否强制使用Serializable?
  • 继续这种方式是否安全,或者我是否应该实现可序列化?。
  • 在哪些?,JPA2实体或PrimaryKey类?

非常感谢你的帮助。

3 个答案:

答案 0 :(得分:4)

JPA规范包含这样的要求(JSR-317 secion 2.4主键和实体标识):

  

主键类必须是可序列化的。

如果EclipseLink确实没有强制执行此要求,那么它是EclipseLink的实现细节,我不建议您依赖它。

但是,对实体的可序列化没有要求,除了以下看起来更像推荐而非要求的实体:

  

如果要通过值将实体实例作为分离对象(例如,通过远程接口)传递,则   实体类必须实现Serializable接口。

答案 1 :(得分:1)

没有什么是可序列化的,但它似乎是由主键的规范(10x到axtavt)所要求的,尽管没有直接需要它。

如果对象通过线程传输或持久存储到磁盘,则需要序列化,因此我无法看到该决定背后的原因。但是,你应该遵守它。

答案 2 :(得分:1)

主键类必须实现serializable和composite-ID类必须实现serializable是两个不同的问题。 我将回答你们两个,并希望它能帮助你从整体上区分和理解。

  1. 主键类必须实现serializable: 注意:它也可以在没有它的实现的情况下工作。 JPA规范包含这样的要求(JSR-317 secion 2.4主键和实体标识):

    主键类必须是可序列化的。

    但是,对实体的可序列化没有要求,因此它是推荐而非要求 例外: 如果要将实体实例作为分离对象传递(例如,通过远程接口),则实体类必须实现Serializable接口。

  2. Composite-ID类必须实现serializable。 id用作索引会话中加载的对象的键。 会话对象需要是可序列化的,因此它引用的所有对象也必须是可序列化的。 对于CompositeIds,类本身用作id。