Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Persistence 为什么JPA-2.0主键类必须实现可序列化,而我的示例却没有实现?_Persistence_Jpa 2.0_Java - Fatal编程技术网

Persistence 为什么JPA-2.0主键类必须实现可序列化,而我的示例却没有实现?

Persistence 为什么JPA-2.0主键类必须实现可序列化,而我的示例却没有实现?,persistence,jpa-2.0,java,Persistence,Jpa 2.0,Java,在许多资料中,我读过PrimaryKey类,甚至JPA2实体都应该是可序列化的 在我的示例(遗留数据库)中,员工和语言之间存在一种关系: 员工类别: @Entity @IdClass(EmpleadoId.class) @Table(name = "NO_INFGRAEMPL") public class Empleado { @Id @Column(name = "IGECOMPANIA", unique = true) private String compania;

在许多资料中,我读过PrimaryKey类,甚至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;

//...
}
员工复合主密钥类:

public class EmpleadoId  {

  private String compania;
  private String numeroIdentificacion;
  //...         
}
public class IdiomaEmpleadoId {

  private EmpleadoId empleado;
  private String idioma;    

  //...    
}
员工语言技能课程:

@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 EmpleadoId  {

  private String compania;
  private String numeroIdentificacion;
  //...         
}
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提供程序,它没有给我任何例外

我的问题是:

  • 为什么它不给我例外?是否不强制要求可序列化
  • 继续这样做安全吗?还是我应该明确实现serializable
  • 在哪些类中?、JPA2实体或PrimaryKey类

非常感谢您的帮助。

无需序列化任何内容,但规范(10x到axtavt)似乎对主键有要求,尽管没有直接的需求


如果对象通过网络传输或持久化到磁盘,则需要序列化,因此我看不出这一决定背后的原因。但是,您应该遵守它。

JPA规范包含这样的要求(第2.4节主键和实体标识):

主键类必须是可序列化的

如果EclipseLink真的不执行此要求,那么这是EclipseLink的一个实现细节,我不建议您依赖它

但是,对实体的可序列化性没有任何要求,但以下要求看起来更像是建议而不是要求:

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


主键类必须实现可序列化,复合ID类必须实现可序列化是两个不同的问题。 我将回答你们两位,并希望这将有助于你们区分和全面理解


  • 主键类必须实现可序列化: 注意:它也可以在不安装i的情况下工作。 JPA规范包含此类要求(JSR-317第2.4节主键和实体标识):

    主键类必须是可序列化的

    但是,对实体的可序列化性没有任何要求,因此这是一个建议而不是要求 例外情况: 如果要将实体实例作为分离对象按值传递(例如,通过远程接口),则实体类必须实现可序列化接口

  • 复合ID类必须实现可序列化。 id用作索引会话中加载的对象的键。 会话对象需要是可序列化的,因此它引用的所有对象也必须是可序列化的。 对于CompositeID,类本身被用作id