为什么复合ID类必须实现Serializable接口?

69
如果我创建一个复合主键类,但它没有实现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实体类不需要实现Serializable接口。那么,为什么复合ID类必须实现Serializable接口呢?我读了这个帖子,但它没有给我足够的信息。


https://dev59.com/rnE95IYBdhLWcg3wdtqj - Perception
我已经阅读了那篇文章,但仍然无法理解根本原因。 - Sanghyun Lee
你的 @IdClass 在哪里? - user3973283
@BillyFrost 这是复合ID类的代码。@IdClass 应该在另一个我没有添加到这里的类中。 - Sanghyun Lee
1个回答

78

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


12
为什么单一ID类不需要实现Serializable接口?你可以详细说明一下吗? - Sanghyun Lee
39
因为ID是一种原始类型,默认情况下是可序列化的。 - Firo
4
有趣的是,我在 JPA 中没有看到复合 ID 类必须可序列化的要求。要将对象用作键,序列化并不是必需的 - 对象必须正确实现 hashcode() 和 equals() 方法。当对象需要以纯文本形式存储在数据库或磁盘上时才使用序列化。这只有在完整对象应该作为单个数据库列中的文本存储时才是必需的。但这在 JPA 中并非如此 - 复合键的每个字段都映射在其各自的列中。 - OndroMih
10
抱歉,我找到了答案,为什么组合键必须是可序列化的 - 这就是规范要求的,如这里所解释的那样。只是在大多数互联网示例中没有明确说明。 - OndroMih
2
会话可能会在Web应用程序的会话缓存中进行序列化,这就是为什么它必须是可序列化的。 - Firo
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接