2012-02-14 11 views
36

Jeśli zrobię klasę kompozytowych id, który nie wykona Serializable jak:Dlaczego klasa composite-id musi implementować 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; 
.... 

błędy występują jak:

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. Dlaczego klasa composite-id musi implementować Serializable? Przeczytałem this thread, ale nie dało mi to wystarczająco dużo informacji.

+0

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

+0

Przeczytałem o tym, ale nadal nie mogę zrozumieć podstawowej przyczyny. –

+0

Gdzie jest twój '@ IdClass'? –

Odpowiedz

43

Obiekt sesji musi być możliwy do serializacji, dlatego wszystkie obiekty, do których się odwołuje, muszą być również przekształcalne do postaci szeregowej. Identyfikator jest używany jako klucz do indeksowania załadowanych obiektów w sesji. W przypadku CompositeId s sama klasa jest używana jako identyfikator.

+6

Dlaczego zatem klasa jednolita nie musi być zdolna do szeregowania? Czy mógłbyś to rozwinąć? –

+21

ponieważ id jest typem pierwotnym, który jest domyślnie serializowany – Firo

+1

Interesujące, nie widziałem żadnych wymagań w JPA, że złożone klasy identyfikatorów muszą być przekształcalne do postaci szeregowej. Serializacja nie jest konieczna do użycia obiektu jako klucza - w tym celu obiekt musi poprawnie implementować metody hashcode() i equals(). Serializacja jest używana, gdy obiekty mają być przechowywane w DB lub na dysku w postaci zwykłego tekstu. Byłoby to konieczne tylko wtedy, gdyby cały obiekt miał być przechowywany jako tekst w pojedynczej kolumnie DB. Ale tak nie jest w przypadku JPA - każde pole klucza złożonego jest mapowane w odpowiedniej kolumnie. – OndrejM

Powiązane problemy