0

hbm2ddl当我使用 Maven 插件添加目标时,我得到了这个 DDL(postgres 目标)hibernate3-maven-plugin

create table listing (
    id varchar(36) not null,
    hash_code int4 not null,
    version int4,
    name varchar(100),
    primary key (id)
);

我定义了所有显示的列。

我在网上看到的所有使用示例:

private static final long serialVersionUID = -8402611044513083864L;

从来没有@Column注释。我的 DDL 没有它的列。别人的吗?

那么Java中的反序列化代码是如何知道一个类的哪个版本被序列化和存储的,而不是它被反序列化的那个版本呢?

4

2 回答 2

3

序列化/反序列化对象时使用序列版本 UID。

如果您将对象注释为 JPA 实体,则您没有使用序列化,而只是将对象转换为另一种表示形式 - 作为数据库表中的一行。
当您从数据库中获取行时,此数据用于创建具有正确设置状态的对象的新实例。

另一方面,如果您想构造对象的二进制表示,然后使用反序列化过程重新创建对象实例,则使用序列化。

请注意,您可以将序列化与 JPA 一起使用,即,如果您想要保留一个字段(在您的 JPA 实体内),该字段既不是基本类型、可嵌入也不是其他实体,而只是一个实现 Serializable 标记接口的普通 Java 类。
但是,在这种情况下,只有实体中的这个给定字段使用序列化/反序列化将二进制数据放入数据库列。仍然 - 序列版 UID 未存储在数据库中的任何位置。

有关持久字段(哪些是持久字段,哪些不是)的更多信息,您可以查看JPA 2.0 FR 规范中的2.2 Persistent Fields and Properties章节。

于 2011-12-12T00:52:01.190 回答
2

静态值从不序列化,JPA 不使用 java 序列化。

于 2011-12-12T00:24:32.280 回答