2012-02-14 13 views
36

Si hago una clase composite-id, que no implementa Serializable como:¿Por qué la clase de identificación compuesta debe implementar Serializable?

@Entity 
@Table(name = "board") 
public class Board { 
    @Id 
    @Column(name = "keyword_news_id") 
    private int id; 

    @Id 
    @Column(name = "board_no") 
    private int boardNo; 
.... 

Se producen errores como:

Caused by: org.hibernate.MappingException: composite-id class must implement Serializable: com.estinternet.news.domain.IssueNewsBoard 
    at org.hibernate.mapping.RootClass.checkCompositeIdentifier(RootClass.java:263) 
    at org.hibernate.mapping.RootClass.validate(RootClass.java:244) 
    at org.hibernate.cfg.Configuration.validate(Configuration.java:1362) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1865) 
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.newSessionFactory(LocalSessionFactoryBean.java:860) 
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:779) 
    at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:211) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1477) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1417) 

Hibernate entity classes doesn't need to be Serializable. Entonces, ¿por qué la clase composite-id debe implementar Serializable? Leí this thread, pero no me dio suficiente información.

+0

http://stackoverflow.com/questions/2301259/hibernate-composite-key – Perception

+0

Lo leí pero todavía no entiendo la causa raíz. –

+0

¿Dónde está tu '@ IdClass'? –

Respuesta

43

El objeto de sesión debe ser serializable, por lo tanto, todos los objetos a los que hace referencia también deben ser serializables. La identificación se utiliza como una clave para indexar objetos cargados en la sesión. En el caso de CompositeId s, la clase en sí misma se usa como id.

+6

Entonces, ¿por qué la clase de ID único no necesita ser serializable? ¿Podrías profundizar en eso? –

+21

porque la identificación es un tipo primitivo que es serializable por defecto – Firo

+1

Interesante, no vi ningún requisito en JPA que las clases de identificación compuestas deben ser serializables. La serialización no es necesaria para usar un objeto como clave, para esto el objeto debe implementar correctamente los métodos hashcode() y equals(). La serialización se usa cuando los objetos se almacenan en DB o en disco en texto sin formato. Esto sería necesario solo si el objeto completo debe almacenarse como texto en una sola columna de DB. Pero este no es el caso en JPA: cada campo de clave compuesta está mapeado en su columna respectiva. – OndrejM

Cuestiones relacionadas