2012-11-06 73 views
5

我用兩個表由Hibernate和 我不明白爲什麼對於特定的查詢我有這個問題。 我希望有人認識到這個問題。org.hibernate.type.SerializationException:無法反序列化

我有一個表用戶

@Entity 
@Table(name="user") 
public class User implements Serializable { 
private static final long serialVersionUID = 1L; 
private Long idUser; 
private Area area; 

//...other get and setter 

@OneToOne(fetch=FetchType.EAGER) 
@JoinColumn(name="idarea") 
public Area getArea() { 
return area; 
} 
} 

和表格區域

@Entity 
@Table(name = "area") 
public class Area implements Serializable { 
private static final long serialVersionUID = 1L; 

@Id @GeneratedValue(strategy=GenerationType.AUTO) 
@Column(name="idarea") 
private Long idArea; 

@Column(name="area_name") 
private String areaName; 

@Column(name="time_start") 
private LocalTime timeStart; 

//...other get and setter 

} 

日誌說:

15:27:28,140 INFO DefaultLoadEventListener:160 - Error performing load command 
org.hibernate.type.SerializationException: could not deserialize 
at org.hibernate.util.SerializationHelper.doDeserialize(SerializationHelper.java:262) 
at org.hibernate.util.SerializationHelper.deserialize(SerializationHelper.java:306) 
at org.hibernate.type.descriptor.java.SerializableTypeDescriptor.fromBytes(SerializableTypeDescriptor.java:130) 
at org.hibernate.type.descriptor.java.SerializableTypeDescriptor.wrap(SerializableTypeDescriptor.java:116) 
at 
....//other lines 
org.springframework.orm.hibernate3.HibernateSystemException: could not deserialize; nested exception is org.hibernate.type.SerializationException: could not deserialize 
+1

爲什麼用戶實體中沒有主鍵? – invariant

+0

「用戶」實體中的其他字段的註釋在哪裏? – axtavt

+0

@invariant對不起,我把現在得到改變爲可視化... – Shinigami

回答

6

我建議設置註釋僅在田野或干將。我更喜歡田野,但那只是我的口味。

參見The Curious case of Field and Property Access in Hibernate

因此要麼放置註解或僅在吸氣劑(屬性)只中的字段。混合使用而不使用@Access會導致異常行爲。

然後,如果序列化是您的應用程序的一部分,我會建議使用工具生成更好的serialVersionUID。

+0

mmm ....你有一個好的工具鏈接? – Shinigami

+0

您使用的是Eclipse嗎?它建在那裏。我認爲Netbeans具有類似的功能。 – Christian

+0

是日食,它把私人靜態最終long serialVersionUID = 1L; (我不會讓「get」和「setter」,這是一個問題嗎?) – Shinigami

4

你可以簡單地註釋上面的喬達時間任何領域:

@Temporal(TemporalType.DATE) 
    @Type(type = "org.jadira.usertype.dateandtime.joda.PersistentLocalDate") 
+1

很棒的回答。 :) – Braisly

1

也許這是一個無聊的話,但如果你有像Eclipse的JBoss Hibernate插件工具生成的實體類,要注意這樣的事實:它將varchar字段的類型設置爲Serializable而不是字符串。

在運行時,你會得到org.hibernate.type.SerializationException: could not deserialize

我損失了很多時間,這樣一個愚蠢的細節。

+0

我在postgis中有一個類型爲'hstore'的字段,JBoss hibernate將它映射到可序列化,我將其更改爲字符串並正確反序列化 –

1

我遇到了同樣的錯誤,但最後,我看到關係中沒有錯誤。如果您認爲在關係中沒有錯誤,則 檢查您的導入,但可能導致其他字段導入錯誤。 例如在我的代碼中 導入由自動導入的java.security.Timestamp自動當我將錯誤的導入更改爲導入java.sql.Timestamp;錯誤消失了。

+0

這很像一個魅力。我也將時間戳更改爲java.sql.Timestamp;序列化問題消失了。 –