首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么JPA-2.0主键类必须实现可序列化,但我的示例不需要?

为什么JPA-2.0主键类必须实现可序列化,但我的示例不需要?
EN

Stack Overflow用户
提问于 2011-04-19 15:42:38
回答 3查看 3.5K关注 0票数 2

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

在我的示例(遗留数据库)中,雇员与语言之间存在着一种关系:

雇员类别:

代码语言:javascript
复制
@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级:

代码语言:javascript
复制
public class EmpleadoId  {

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

员工语言SKill类:

代码语言:javascript
复制
@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类:

代码语言:javascript
复制
public class IdiomaEmpleadoId {

  private EmpleadoId empleado;
  private String idioma;    

  //...    
}

语文班:

代码语言:javascript
复制
@Entity
@Table(name = "NO_IDIOMAS")    
public class Idioma {

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

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

//...
}

我在一个EclipseLink应用程序下使用JPA2提供程序,它没有给我任何例外。

我的问题是:

  • 为什么不给我例外呢?有可序列化不是强制的吗?
  • 这样继续下去是安全的,还是我确实应该实现可序列化的呢?
  • 在哪些类中?,JPA2实体还是PrimaryKey类?

非常感谢你的帮助。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-19 16:07:38

JPA规范包含这样的要求(JSR-317 secion2.4主密钥和实体标识):

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

如果EclipseLink真的没有强制执行这一要求,这是EclipseLink的实现细节,我建议您不要依赖它。

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

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

票数 4
EN

Stack Overflow用户

发布于 2011-04-19 15:49:45

什么都不需要串行化,但似乎是由规范(10x到axtavt)对主键进行调整的,尽管对它没有直接的需求。

如果对象是通过线路传输或持久化到磁盘上,则需要序列化,因此我看不到该决定背后的原因。然而,你应该遵守它。

票数 2
EN

Stack Overflow用户

发布于 2016-08-08 07:27:37

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

  1. 主键类必须实现可序列化:注意:它也可以在不使用iplementation的情况下工作。JPA规范包含这样的要求(JSR-317 secion 2.4主键和实体标识): 主键类必须是可序列化的。 但是,对实体的可序列化性没有任何要求,所以这是一个建议,而不是一个需求例外:如果要将一个实体实例作为一个独立对象(例如,通过一个远程接口)通过值传递,那么实体类必须实现可序列化接口。
  2. 复合ID类必须实现可序列化。该id用作索引会话中加载的对象的键。会话对象需要是可序列化的,因此它引用的所有对象也必须是可序列化的。对于CompositeIds,类本身被用作id。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5719015

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档