2012-02-14 45 views
36

如果我做一个复合-ID类没有实现Serializable,如:为什么composite-id类必须实现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; 
.... 

错误发生,如:

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。那么,为什么composite-id类必须实现Serializable?我读this thread,但它没有给我足够的信息。

+0

http://stackoverflow.com/questions/2301259/hibernate-composite-key – Perception 2012-02-14 05:24:49

+0

我读了,但仍然无法理解的根本原因。 – 2012-02-14 06:39:47

+0

你的'@ IdClass'在哪里? – 2016-09-07 08:03:01

回答

43

会话对象必须是序列化的,因此它引用的所有对象必须是可序列化也是如此。 该id用作索引会话中加载对象的键。在CompositeId的情况下,类本身被用作id。

+6

那么为什么single-id类不需要被Serializable?你能详细说明一下吗? – 2012-02-14 12:11:16

+21

因为ID是一个原始类型,是由默认可序列 – Firo 2012-02-14 13:18:53

+1

有趣的是,我没有看到,复合ID类必须是可序列化的JPA任何要求。使用对象作为键不需要序列化 ​​- 为此对象必须正确实现hashcode()和equals()方法。序列化用于将对象以纯文本形式存储在数据库或磁盘中。仅当完整对象应该作为文本存储在单个数据库列中时才需要这样做。但JPA并非如此 - 复合关键字的每个字段都映射到其各自的列中。 – OndrejM 2015-09-30 13:14:12

相关问题