2012-11-06 234 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;序列化问题消失了。 –

相关问题