Почему классы первичных ключей JPA-2.0 должны реализовывать Serializable, а мой пример работает без? - PullRequest
2 голосов
/ 19 апреля 2011

Во многих источниках я читал классы 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;

//...
}

Соединение сотрудников 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?

Большое спасибо за помощь.

Ответы [ 3 ]

4 голосов
/ 19 апреля 2011

Спецификация JPA содержит такое требование ( JSR-317 секция 2.4 Первичные ключи и идентификационные данные сущности):

Класс первичного ключа должен быть сериализуемым.

Если EclipseLink действительно не соблюдает это требование, это деталь реализации EclipseLink, и я бы не рекомендовал вам полагаться на нее.

Однако нет никаких требований к сериализуемости объектов, за исключением следующего, который больше похож на рекомендацию, чем на требование:

Если экземпляр объекта должен передаваться по значению как отдельный объект (например, через удаленный интерфейс), Класс сущности должен реализовывать интерфейс Serializable.

1 голос
/ 08 августа 2016

Классы первичного ключа должны реализовывать сериализуемый, а класс составного идентификатора должен реализовывать сериализуемые два разных вопроса. Я собираюсь ответить вам обоим и надеюсь, что это поможет вам различать и понимать целостно.

  1. Классы первичного ключа должны реализовывать сериализуемые: Примечание: он может работать и без его реализации. Спецификация JPA содержит такое требование (JSR-317, раздел 2.4, первичные ключи и идентификационные данные сущности):

    Класс первичного ключа должен быть сериализуемым.

    Однако нет никаких требований к сериализуемости объектов, поэтому это рекомендация, а не требование исключение: Если экземпляр сущности должен передаваться по значению как отдельный объект (например, через удаленный интерфейс), класс сущности должен реализовывать интерфейс Serializable.

  2. Класс составного идентификатора должен реализовывать сериализуемый. Идентификатор используется в качестве ключа для индексации загруженных объектов в сеансе. Объект сеанса должен быть сериализуемым, следовательно, все объекты, на которые он ссылается, должны быть также сериализуемыми. В случае CompositeIds в качестве идентификатора используется сам класс.

1 голос
/ 19 апреля 2011

Ничего не требуется, чтобы сериализоваться, но, похоже, это требуется спецификацией (от 10x до axtavt) для первичных ключей, хотя в этом нет прямой необходимости.

Сериализация необходима, если объектыперенесены по проводам или сохранены на диск, поэтому я не вижу причины этого решения.Тем не менее, вы должны соответствовать этому.

...