我有关于 Postgres 和 GenerationType.Identity 与 Sequence 的问题
在这个例子中...
@Id
@SequenceGenerator(name="mytable_id_seq",
sequenceName="mytable_id_seq",
allocationSize=1)
@GeneratedValue(strategy = GenerationType.SEQUENCE,
generator="mytable_id_seq")
我知道我正在通过注释指定要使用的 Postgres 序列。
但是,我有一个用“serial”类型定义的 id 列,我读到我可以简单地使用 GenerationType.IDENTITY ,它将自动生成一个数据库序列并使用它来自动增量。
如果是这种情况,我认为使用 SEQUENCE 注释没有任何优势,除非您使用整数作为 id 或有某些特定原因使用您创建的另一个序列。 IDENTITY 的代码要少得多,并且有可能使其可以跨数据库移植。
我有什么遗漏的吗?
预先感谢您的反馈。
如果您有一列类型SERIAL
,这足以注释你的id
字段:
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
这告诉 Hibernate 数据库将负责生成id
柱子。数据库如何实现自动生成是特定于供应商的,并且可以被认为对 Hibernate 是“透明的”。 Hibernate只需要知道插入行后,会有一个id
它可以以某种方式检索该行的值。
如果使用GenerationType.SEQUENCE
,您告诉 Hibernate 数据库不会自动填充id
柱子。相反,Hibernate 负责从指定序列中获取下一个序列值并将其用作id
插入行时的值。所以 Hibernate 正在生成并插入id
.
就 Postgres 而言,恰好定义了一个SERIAL
列是通过创建序列并将其用作默认列值来实现的。但填充的是数据库id
字段如此使用GenerationType.IDENTITY
告诉 Hibernate 数据库正在处理 id 生成。
这些参考资料可能会有所帮助:
http://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#identifiers-generators http://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#identifiers-generators
https://www.postgresql.org/docs/8.1/static/datatype.html#DATATYPE-SERIAL https://www.postgresql.org/docs/8.1/static/datatype.html#DATATYPE-SERIAL
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)