为什么composite-id类必须实现Serializable?

San*_*Lee 46 java hibernate

如果我创建一个复合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;
....
Run Code Online (Sandbox Code Playgroud)

错误发生如下:

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)
Run Code Online (Sandbox Code Playgroud)

Hibernate实体类不需要是Serializable.那么,为什么composite-id类必须实现Serializable?我读了这个帖子,但它没有给我足够的信息.

Fir*_*iro 58

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

  • 因为id是一个基本类型,默认情况下是可序列化的 (29认同)
  • 那么为什么single-id类不需要是Serializable?你能详细说明吗? (9认同)
  • 我道歉,我找到了为什么复合键必须可序列化的答案 - 它只是规范所要求的,如解释[here](http://stackoverflow.com/questions/3585034/how-to-map-a-composite - 键与 - 休眠#答案-3588400).在互联网上的大多数例子中都没有明确说明. (6认同)
  • 有趣的是,我没有在JPA中看到任何要求复合id类必须可序列化的要求。不需要使用对象作为键进行序列化-为此,该对象必须正确实现hashcode()和equals()方法。当对象以纯文本格式存储在数据库或磁盘中时,使用序列化。仅当完整对象应作为文本存储在单个DB列中时,才需要这样做。但这在JPA中不是这种情况-复合键的每个字段都映射在其各自的列中。 (3认同)
  • 会话可能会在 Web 应用程序的会话缓存中序列化。这就是为什么它必须是可序列化的 (2认同)