带有GenerationType.IDENTITY的JPA和PostgreSQL

Mik*_*ike 6 postgresql hibernate jpa

我有一个关于Postgres和GenerationType.Identity与Sequence的问题

在这个例子中......

@Id
@SequenceGenerator(name="mytable_id_seq",
                   sequenceName="mytable_id_seq",
                   allocationSize=1)
@GeneratedValue(strategy = GenerationType.SEQUENCE,
                generator="mytable_id_seq")
Run Code Online (Sandbox Code Playgroud)

我知道我正在通过注释指定Postgres序列.

但是,我有一个用'serial'类型定义的id列,我读过我可以简单地使用GenerationType.IDENTITY,它会自动生成一个db序列并用它来自动递增.

如果是这种情况,我认为使用SEQUENCE注释没有优势,除非您使用id的整数或者有一些特定的理由使用您创建的其他序列.IDENTITY的代码很少,并且可能使它在数据库中可移植.

有什么我想念的吗?

提前感谢您的反馈.

Gle*_*enn 16

如果您有一个类型的列SERIAL,则使用以下内容注释您的id字段就足够了:

@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
Run Code Online (Sandbox Code Playgroud)

这告诉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

https://www.postgresql.org/docs/8.1/static/datatype.html#DATATYPE-SERIAL