A pergunta está no título. Abaixo, acabei de descrever alguns dos meus pensamentos e descobertas.
Quando eu tinha um modelo de domínio muito simples (3 tabelas sem nenhuma relação), todas as minhas entidades NÃO implementavam Serializable.
Mas quando o modelo de domínio se tornou mais complexo, obtive o RuntimeException, que dizia que uma das minhas entidades não implementava Serializable.
Eu uso o Hibernate como uma implementação JPA.
Eu me pergunto:
- É um requisito / comportamento específico do fornecedor?
- O que acontece com minhas entidades serializáveis? Eles devem ser serializáveis para armazenamento ou transferência?
- Em que momento se torna necessário tornar minha entidade serializável?
Serializable
são dois conceitos diferentes.De acordo com a JPA Spec:
"JSR 220: Enterprise JavaBeansTM, Versão 3.0 Java Persistence API Versão 3.0, Versão final em 2 de maio de 2006"
fonte
Serializable
poderia ser útil com isso, e no contexto de persistência mais consistente do queCloneable
por exemplo.Você precisa de suas entidades
Serializable
se precisar transferi-las por fio (serialize-as para alguma outra representação), armazene-as na sessão http (que por sua vez é serializada em disco rígido pelo contêiner do servlet), etc.Apenas por uma questão de persistência,
Serializable
não é necessário, pelo menos com o Hibernate. Mas é uma prática recomendada fazê-losSerializable
.fonte
De acordo com os documentos do hibernate , ao usar a anotação @JoinColumn:
fonte
Para complementar a boa resposta de Conor, que se referiu às especificações JSR-317. Normalmente, os projetos EAR consistem em um módulo EJB com os EJBs expostos por meio de uma interface remota. Nesse caso, você precisa tornar seus beans de entidade serializáveis, pois eles são agregados no EJB remoto e construídos para serem conectados através da rede.
Um projeto de guerra JEE6 sem CDI: pode conter EJB lite apoiado por entidades JPA não serializáveis.
Um projeto de guerra JEE6 com CDI: Beans que usam escopo de sessão, aplicativo ou conversa devem ser serializáveis, mas os beans que usam escopo de solicitação não precisam ser serializáveis. Assim, os beans de entidade JPA subjacentes - se houver - seguiriam a mesma semântica.
fonte
Se falamos apenas de persistência,
Serializable
não é necessário. Mas é uma prática recomendada criar as entidadesSerializable
.Se estamos expondo
domain
/entities
objetos diretamente expostos à camada de apresentação, em vez de usarDTO
, nesse caso, precisamos implementarSerializable
. Esses objetos de domínio podem ser armazenadosHTTPSession
para fins de cache / otimização. Uma sessão http pode ser serializada ou agrupada. E também é necessário para transferir dados entreJVM
instâncias.Quando usamos
DTO
para dissociar a camada de persistência e a camada de serviço, marcar os objetos do domínio comoSerializable
contraproducente e violar a "encapsulation
”. Então se torna um anti-padrão.Identificadores compostos
A classe de chave primária deve ser serializável.
Modelos POJO
Se uma instância de entidade deve ser usada remotamente como um objeto desanexado, a classe de entidade deve implementar a
Serializable
interface.Cache
Além disso, se você estiver implementando um
clustered
segundo nívelcache
, suas entidades deverão estarserializable
. O identificador deve serSerializable
porque esse é um requisito de JPA, poisidentifier
pode ser usado como a chave para uma entrada de cache de segundo nível.E quando serializamos entidades, certifique-se de fornecer explícito
serialVersionUID
o modificador de acesso privado. Porque se umserializable
classe não declarar explicitamente aserialVersionUID
, o tempo de execução da serialização calculará umserialVersionUID
valor padrão para essa classe com base em vários aspectos da classe, conforme descrito em Java (TM) Object Serialization Specification. AserialVersionUID
computação padrão é altamente sensível aos detalhes da classe que podem variar dependendo das implementações do compilador e, portanto, podem resultar em inesperadoInvalidClassExceptions
durante a desserialização.fonte
Acredito que seu problema está relacionado a ter um campo de um tipo complexo (classe) que não está anotado. Nesses casos, o tratamento padrão armazenará o objeto em sua forma serializada no banco de dados (o que provavelmente não é o que você pretendia fazer) Exemplo:
No caso acima, os Dados do Cliente serão salvos em um campo de matriz de bytes no banco de dados em seu formato serializado.
fonte
Especificação JPA
De acordo com a especificação da JPA, uma entidade deve implementar
Serializable
apenas se precisar ser transmitida de uma JVM para outra ou se a entidade for usada por um Bean de Sessão com Estado, que precisa ser passivado pelo contêiner EJB.Hibernate
O Hibernate requer apenas que os atributos da entidade sejam
Serializable
, mas não a própria entidade.No entanto, implementando a especificação da JPA, todos os requisitos da JPA relativos a
Serializable
entidades também se aplicam ao Hibernate.Tomcat
De acordo com a documentação do Tomcat , os
HttpSession
atributos também precisam serSerializable
:Portanto, se a entidade estiver armazenada no
HttpSession
, ela deve implementarSerializable
.fonte
As classes devem implementar Serializable se você deseja serializá-las. Isso não está diretamente relacionado à JPA e a especificação da JPA não exige que as entidades sejam serializáveis. Se o Hibernate realmente reclamar disso, suponho que seja um bug do Hibernate, mas suponho que você, direta ou indiretamente, esteja fazendo outra coisa com as entidades, o que exige que elas sejam serializáveis.
fonte
Consulte http://www.adam-bien.com/roller/abien/entry/do_jpa_entities_have_para ele diz: A implementação do java.io.Serializable é simplesmente necessária para a transferência de dados via IIOP ou JRMP (RMI) entre instâncias da JVM. No caso de um aplicativo Web puro, os objetos do domínio às vezes são armazenados no HTTPSession para fins de cache / otimização. Uma sessão http pode ser serializada (passivação) ou em cluster. Nos dois casos, todo o conteúdo deve ser serializável.
fonte
hit remoto usando carteiro ou ajax ou js angulares etc ....., pode causar o ciclo de repetição com a exceção StackOverflow com o Jackson mais rápidoxml.Então, é melhor usar o serializador.
fonte
A implementação do ehcache com o diskstore como cache de segundo nível (isto é, usando
@Cacheable
anotação na entidade ou método de repositório / serviço) requer Serializable, caso contrário, o cache falhará (NotSerializableException
) ao gravar a entidade no cache do disco.fonte
Este também é o erro que ocorre quando você passa um ID digitado incorretamente como o segundo parâmetro para algo como em.find () (ou seja, passar a própria entidade em vez de seu ID). Ainda não achei necessário declarar serialmente entidades JPA serializáveis - não é realmente necessário, a menos que você esteja usando referencedColumnName conforme descrito por aman.
fonte
quando entidades JPA são usadas como parâmetros ou retornam valores pelas operações EJB remotas
fonte