Вопрос в заголовке. Ниже я только что описал некоторые свои мысли и выводы.
Когда у меня была очень простая модель предметной области (3 таблицы без каких-либо отношений), все мои объекты НЕ реализовывали Serializable.
Но когда модель предметной области стала более сложной, я получил RuntimeException, в котором говорилось, что одна из моих сущностей не реализовала Serializable.
Я использую Hibernate в качестве реализации JPA.
Я думаю:
- Это специфичное для поставщика требование / поведение?
- Что происходит с моими сериализуемыми объектами? Должны ли они быть сериализуемыми для хранения или передачи?
- В какой момент становится необходимым сделать сериализованную мою сущность?
Serializable
две разные концепции.Согласно спецификации JPA:
«JSR 220: Enterprise JavaBeansTM, версия 3.0 API персистентности Java версии 3.0, финальная версия 2 мая 2006 г.»
источник
Serializable
может быть полезным в этом, и в контексте постоянства более последовательным, чем,Cloneable
например.Ваши сущности должны быть такими,
Serializable
если вам нужно перенести их по проводам (сериализовать их в какое-то другое представление), сохранить их в сеансе http (который, в свою очередь, сериализуется на жесткий диск контейнером сервлета) и т. Д.Просто ради настойчивости
Serializable
не нужно, по крайней мере, с Hibernate. Но это лучшая практика, чтобы сделать ихSerializable
.источник
Согласно документам спящего режима при использовании аннотации @JoinColumn:
источник
В дополнение к приятному ответу Конора, который ссылался на спецификации JSR-317. Как правило, проекты EAR состоят из модуля EJB с EJB, предоставляемыми через удаленный интерфейс. В этом одном случае вам нужно сделать сериализованные бины сущностей такими, как они агрегированы в удаленном EJB-компоненте и созданы для передачи по сети.
Военный проект JEE6 без CDI: может содержать EJB lite, поддерживаемый несериализуемыми сущностями JPA.
Военный проект JEE6 с CDI: bean-компоненты, использующие область сеанса, приложения или диалога, должны быть сериализуемыми, но bean-объекты, использующие область запроса, не должны быть сериализуемыми. Таким образом, базовые бины сущности JPA -if any- будут следовать той же семантике.
источник
Если мы просто говорим о настойчивости,
Serializable
это не нужно, но лучше всего создавать сущностиSerializable
.Если мы выставляем объекты
domain
/entities
объекты, непосредственно представленные на уровне представления, вместо использованияDTO
, то в этом случае нам нужно реализоватьSerializable
. Эти доменные объекты могут храниться вHTTPSession
целях кэширования / оптимизации. Http-сессия может быть сериализована или сгруппирована. И это также требуется для передачи данных междуJVM
экземплярами.Когда мы используем
DTO
для разделения персистентного уровня и сервисного уровня, маркировка доменных объектовSerializable
будет непродуктивной и нарушит «encapsulation
». Тогда это становится анти-паттерном.Составные идентификаторы
Класс первичного ключа должен быть сериализуемым.
POJO Модели
Если экземпляр сущности должен использоваться удаленно как отдельный объект, класс сущности должен реализовывать
Serializable
интерфейс.Кэш
Кроме того, если вы реализуете
clustered
второй уровень,cache
то ваши сущности должны бытьserializable
. Идентификатор должен бытьSerializable
потому, что это требование JPA, поскольку егоidentifier
можно использовать в качестве ключа для записи в кэш второго уровня.И когда мы сериализуем сущности, убедитесь, что предоставили явные
serialVersionUID
с модификатором частного доступа. Потому что, еслиserializable
класс явно не объявляет aserialVersionUID
, тогда среда выполнения сериализации вычислитserialVersionUID
значение по умолчанию для этого класса на основе различных аспектов класса, как описано в Спецификации сериализации объектов Java (TM).serialVersionUID
Вычисления по умолчанию очень чувствительны к деталям класса, которые могут различаться в зависимости от реализаций компилятора, и, следовательно, могут привести к неожиданнымInvalidClassExceptions
последствиям при десериализации.источник
Я считаю, что ваша проблема связана с наличием поля сложного типа (класса), которое не аннотировано. В таких случаях обработка по умолчанию будет хранить объект в его сериализованной форме в базе данных (что, вероятно, не то, что вы хотели сделать) Пример:
В приведенном выше случае CustomerData будет сохранен в поле байтового массива в базе данных в его сериализованной форме.
источник
Спецификация JPA
В соответствии со спецификацией JPA, объект должен реализовываться
Serializable
только в том случае, если его необходимо передать из одной JVM в другую или если объект используется компонентом сеанса с сохранением состояния, который должен пассивироваться контейнером EJB.Hibernate
Hibernate требует только, чтобы атрибуты сущности были
Serializable
, но не сама сущность.Однако, реализуя спецификацию JPA, все требования JPA, касающиеся
Serializable
сущностей, применимы и к Hibernate.Кот
Согласно документации Tomcat ,
HttpSession
атрибуты также должны бытьSerializable
:Таким образом, если объект хранится в
HttpSession
, он должен реализоватьSerializable
.источник
Классы должны реализовывать Serializable, если вы хотите их сериализовать. Это не имеет прямого отношения к JPA, и спецификация JPA не требует, чтобы объекты были сериализуемыми. Если Hibernate действительно жалуется на это, я предполагаю, что это ошибка Hibernate, но я предполагаю, что вы прямо или косвенно делаете что-то еще с объектами, которые требуют их сериализации.
источник
Пожалуйста, обратитесь http://www.adam-bien.com/roller/abien/entry/do_jpa_entities_have_to, где сказано: «Реализация java.io.Serializable просто необходима для передачи данных через IIOP или JRMP (RMI) между экземплярами JVM. В случае чистого веб-приложения доменные объекты иногда хранятся в HTTPSession для целей кэширования / оптимизации. Http-сессия может быть сериализована (пассивироваться) или кластеризована. В обоих случаях весь контент должен быть сериализуемым.
источник
удаленное попадание с использованием почтальона или ajax или углового js и т. д. ....., может вызвать цикл повторения с исключением StackOverflow с Джексоном fastxml. Так что лучше использовать сериализатор.
источник
Реализация ehcache с дисковым хранилищем в качестве кэша второго уровня (т. Е. С использованием
@Cacheable
аннотации на сущности или метода репозитория / службы) требует Serializable, иначе кешу не удастся (NotSerializableException
) записать сущность в дисковый кеш.источник
Это также ошибка, которая выдается, когда вы передаете неверно введенный идентификатор в качестве второго параметра чему-то вроде em.find () (т.е. передаете сам объект, а не его идентификатор). Я пока не счел необходимым фактически объявлять сущности JPA сериализуемыми - в действительности это не нужно, если вы не используете referencedColumnName, как описано aman.
источник
когда объекты JPA используются в качестве параметров или возвращаемых значений удаленными операциями EJB
источник