2012-02-14 28 views
36

Nếu tôi thực hiện một lớp composite-id mà không thực hiện Serializable như: xảy raTại sao lớp composite-id phải triển khai 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; 
.... 

lỗi như:

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. Sau đó, tại sao lớp composite-id phải triển khai Serializable? Tôi đọc this thread, nhưng nó không cho tôi đủ thông tin.

+0

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

+0

Tôi đọc điều đó nhưng vẫn không thể hiểu được nguyên nhân gốc rễ. –

+0

'@ IdClass' của bạn ở đâu? –

Trả lời

43

Đối tượng phiên cần phải được tuần tự hóa do đó tất cả các đối tượng được tham chiếu bởi nó phải được tuần tự hóa. Id được sử dụng làm khóa để lập chỉ mục các đối tượng được tải trong phiên. Trong trường hợp CompositeId s, chính lớp đó được sử dụng làm id.

+6

Sau đó, tại sao một lớp id không cần phải Serializable? Bạn có thể giải thích về điều đó không? –

+21

vì id là kiểu nguyên thủy theo mặc định nối tiếp – Firo

+1

Thú vị, tôi không thấy bất kỳ yêu cầu nào trong JPA rằng các lớp id tổng hợp phải được tuần tự hóa. Việc tuần tự hóa không cần thiết để sử dụng một đối tượng làm khóa - cho đối tượng này phải triển khai đúng phương thức hashcode() và equals(). Serialization được sử dụng khi các đối tượng được lưu trữ trong DB hoặc trên đĩa trong văn bản thuần túy. Điều này sẽ chỉ cần thiết nếu đối tượng hoàn chỉnh được lưu trữ dưới dạng văn bản trong cột DB đơn. Nhưng đây không phải là trường hợp trong JPA - mỗi trường của khóa ghép được ánh xạ trong cột tương ứng của nó. – OndrejM

Các vấn đề liên quan