【问题标题】:org.hibernate.type.SerializationException: could not deserializeorg.hibernate.type.SerializationException:无法反序列化
【发布时间】:2019-01-09 02:09:11
【问题描述】:

我正在使用 Hibernate 的两个表和 我不明白为什么对于特定查询我有这个问题。 我希望有人能认识到这个问题。

我有一个表用户

@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

【问题讨论】:

  • 为什么用户实体中没有主键?
  • User实体中其他字段的注释在哪里?
  • @invariant 抱歉,我已经为可视化添加了 get now 更改...

标签: hibernate exception serialization deserialization


【解决方案1】:

您可以简单地在 joda time 的任何字段上方进行注释:

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

【讨论】:

  • 其实这应该是公认的答案。关于混合字段和属性访问的提示是可以的,但不是问题的原因。
【解决方案2】:

我建议仅在字段或 getter 上设置注释。我更喜欢田野,但这只是我的口味。

The Curious case of Field and Property Access in Hibernate:

因此,要么只将注释放在字段上,要么只放在 getter(properties) 上。混合使用而不使用@Access 会导致异常行为。

如果序列化是您的应用程序的一部分,我建议使用工具生成更好的 serialVersionUID。

【讨论】:

  • 您在使用 Eclipse 吗?它建在那里。我认为 Netbeans 有一个类似的功能。
  • 是的 Eclipse,它把私有静态最终 long serialVersionUID = 1L; (我不做“get”和“setter”,有问题吗?)
  • 我有两个选项:默认和生成。使用生成。我的另一个想法是您的课程不可序列化,因为某些成员不可序列化。如果您可以创建一个测试用例(即在 pastebin.com),我可以进一步调查该问题。但是你接受了我的回答。这是否意味着,我使用 getter 或字段的建议成功了?
  • 已解决好的,感谢您就该领域进行调查的建议。事实上,我有一个时间字段的 org.joda.time.LocalTime 现在我通过 java.sql.Time 更改并且它可以工作。我现在不知道为什么,但它发生了。
【解决方案3】:

我遇到了同样的错误,但最后,我看到关系中没有错误。如果您认为关系中没有错误,那么 检查您的导入,其他字段可能导入错误。 例如在我的代码中 import java.security.Timestamp由idea自动导入当我将错误导入改为导入java.sql.Timestamp时;错误消失了。

【讨论】:

    【解决方案4】:

    也许这是一句无关紧要的话,但如果您使用 Eclipse JBoss Hibernate 插件等工具生成实体类,请注意它将varchar 字段的类型设置为Serializable 而不是字符串。

    在运行时你会得到org.hibernate.type.SerializationException: could not deserialize

    我为这样一个愚蠢的细节浪费了很多时间。

    【讨论】:

    • 我在 postgis 中遇到了一个 'hstore' 类型字段的问题,JBoss hibernate 将其映射为可序列化,我将其更改为 String 并正确反序列化
    【解决方案5】:

    当我有一个类型为 Number 而不是 Integer 的持久类属性时,我遇到了这个问题

    【讨论】:

      猜你喜欢
      • 2012-10-05
      • 2020-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-06
      • 1970-01-01
      • 2016-12-30
      • 1970-01-01
      相关资源
      最近更新 更多