Когда и почему сущности JPA должны реализовывать интерфейс Serializable?

Вопрос находится в названии. Ниже я только что описал некоторые мои мысли и находки.

Когда у меня была очень простая модель домена (3 таблицы без каких-либо отношений), все мои объекты НЕ реализовали Serializable.

Но когда модель домена стала более сложной, я получил RuntimeException, в которой говорилось, что один из моих сущностей не реализовал Serializable.

Я использую Hibernate как реализацию JPA.

Интересно:

  • Является ли это конкретным требованием/поведением поставщика?
  • Что происходит с моими сериализуемыми объектами? Должны ли они быть сериализуемыми для хранения или передачи?
  • В какой момент возникает необходимость сделать мою сущность сериализуемой?

Ответ 1

Это обычно происходит, если вы смешиваете HQL и собственные SQL-запросы. В HQL Hibernate сопоставляет типы, которые вы передаете, независимо от того, что понимает БД. Когда вы запускаете собственный SQL, вы должны сами сделать сопоставление. Если вы этого не сделаете, тогда сопоставление по умолчанию - это сериализовать параметр и отправить его в базу данных (в надежде, что он это понял).

Ответ 2

Согласно JPA Spec:

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

"JSR 220: Enterprise JavaBeansTM, версия 3.0 Java Persistence API версии 3.0, окончательная версия 2 мая 2006 г.

Ответ 3

Вам нужно, чтобы ваши объекты были Serializable, если вам нужно перенести их поверх проводки (сериализуйте их в другое представление), сохраните их в сеансе http (который, в свою очередь, сериализуется на жесткий диск с помощью контейнера сервлета ) и т.д.

Просто для сохранения, Serializable не требуется, по крайней мере, с Hibernate. Но лучше всего сделать их Serializable.

Ответ 4

В дополнение к приятному ответу Конора, который ссылался на спецификации JSR-317. Как правило, проекты EAR состоят из модуля EJB с EJB, которые отображаются через удаленный интерфейс. В этом случае вам необходимо сделать сериализацию вашей сущности beans, поскольку они агрегируются в удаленном EJB и созданы для подключения через сеть.

Военный проект JEE6 без CDI: может содержать EJB lite, поддерживаемый несериализуемыми объектами JPA.

Военный проект JEE6 с CDI: Beans, которые используют сеанс, приложение или область разговора, должны быть сериализованы, но beans, которые используют область запроса не должны быть сериализуемыми. Таким образом, базовый объект JPA beans -if любой будет следовать той же семантике.

Ответ 5

Я считаю, что ваша проблема связана с наличием поля сложного типа (класса), который не аннотируется. В таких случаях обработка по умолчанию будет хранить объект в сериализованной форме в базе данных (что, вероятно, не то, что вы хотели сделать) Пример:

Class CustomerData {
    int getAge();
    void setAge(int age);
}

@Entity
Class Customer {
  CustomerData getCustomerData();
  void setCustomerData(CustomerData data)
}

В приведенном выше случае CustomerData будет сохранен в поле байтового массива в базе данных в сериализованной форме.

Ответ 6

Классы должны реализовывать Serializable, если вы хотите их сериализовать. Это напрямую не связано с JPA, и спецификация JPA не требует, чтобы сущности были сериализуемыми. Если Hibernate действительно жалуется на это, я полагаю, что это ошибка Hibernate, но я полагаю, что вы прямо или косвенно делаете что-то еще с объектами, которые требуют, чтобы они были сериализуемыми.

Ответ 7

В соответствии с hibernate docs при использовании аннотации @JoinColumn:

Он имеет еще один параметр с именем referencedColumnName. Этот параметр объявляет столбец целевого объекта, который будет использоваться для соединения. Обратите внимание, что при использовании referencedColumnName в столбце не первичного ключа связанный класс должен быть Serializable.

Ответ 8

Это также ошибка, возникающая при передаче неверно типизированного идентификатора в качестве второго параметра для чего-то вроде em.find() (т.е. передачи самого объекта, а не его идентификатора). Я не счел нужным фактически объявлять сущности JPA сериализуемыми - это действительно не нужно, если вы не используете ссылочное имяColumnName, как описано аманом.

Ответ 9

удаленный доступ с использованием postman или ajax или angular js и т.д., может вызвать цикл повторения с исключением StackOverflow с помощью quicksonml.