当我使用 Maven 插件 hibernate3-maven-plugin
添加目标 hbm2ddl
时,我得到了这个 DDL(postgres 目标):
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 中的反序列化代码如何知道一个类被序列化和存储的版本与它被反序列化到的版本?
最佳答案
序列化/反序列化对象时使用序列化版本UID。
如果您将对象注释为 JPA 实体,则您不使用序列化,而只是将对象转换为另一种表示形式 - 作为数据库表中的一行。
当您从数据库中获取行时,该数据将用于创建具有正确设置状态的新对象实例。
另一方面,如果您想构造对象的二进制表示形式,然后使用反序列化过程重新创建对象实例,则可以使用序列化。
请注意,您可以在 JPA 中使用序列化,即,如果您想要保留一个字段(在您的 JPA 实体内),该字段既不是基本类型、可嵌入的也不是其他实体,而只是一个普通的 Java 类,实现可序列化标记接口(interface)。
但是,在这种情况下,只有实体中的给定字段使用序列化/反序列化将二进制数据放入数据库列中。尽管如此 - 序列版本 UID 并未存储在数据库中的任何位置。
有关持久字段(哪些是持久字段,哪些不是)的更多信息,您可以查看 JPA 2.0 FR specification 中的2.2 持久字段和属性章节。 .
关于java - 为什么Hibernate 不生成包含serialVersionUID 列的DDL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8468511/