Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JPA和具有GenerationType.IDENTITY的PostgreSQL_Postgresql_Hibernate_Jpa - Fatal编程技术网

JPA和具有GenerationType.IDENTITY的PostgreSQL

JPA和具有GenerationType.IDENTITY的PostgreSQL,postgresql,hibernate,jpa,Postgresql,Hibernate,Jpa,我有一个关于博士后和世代类型的问题。身份与顺序 在这个例子中 @Id @SequenceGenerator(name="mytable_id_seq", sequenceName="mytable_id_seq", allocationSize=1) @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="mytable

我有一个关于博士后和世代类型的问题。身份与顺序

在这个例子中

@Id
@SequenceGenerator(name="mytable_id_seq",
                   sequenceName="mytable_id_seq",
                   allocationSize=1)
@GeneratedValue(strategy = GenerationType.SEQUENCE,
                generator="mytable_id_seq")
我知道我正在指定一个Postgres序列以通过注释使用

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

如果是这样的话,我不认为使用序列注释有什么好处,除非您使用整数作为id,或者有特定的理由使用您创建的另一个序列。IDENTITY的代码更少,并且有可能使它可以跨数据库移植

有什么我遗漏的吗


提前感谢您的反馈。

如果您有一列类型为
SERIAL
,只需在
id
字段上添加以下注释即可:

@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
这告诉Hibernate数据库将负责生成
id
列。数据库如何实现自动生成是特定于供应商的,对于Hibernate来说是“透明的”。Hibernate只需要知道在插入行之后,该行将有一个
id
值,它可以以某种方式检索该值

如果使用
GenerationType.SEQUENCE
,则表明数据库不会自动填充
id
列。相反,Hibernate负责从指定的序列中获取下一个序列值,并在插入行时将其用作
id
值。因此Hibernate正在生成并插入
id

在Postgres的情况下,定义一个
SERIAL
列是通过创建一个序列并将其用作默认列值来实现的。但是填充
id
字段的是数据库,因此使用
GenerationType.IDENTITY
告诉Hibernate数据库正在处理id生成

这些参考资料可能有助于:


我认为,如果您对多个表使用相同的序列(例如,对于许多类型的票据,您需要一个唯一的标识符),这会很有帮助。。。此外,如果您希望跟踪自动生成的键的序列,请参见“从”书本:


“使用标识和其他id生成策略之间的另一个区别(前面已经暗示)是,只有在插入之后才能访问标识符。尽管在事务完成之前没有保证标识符的可访问性,但至少其他类型的生成可以急切地分配标识符。但是当使用identity时,是插入操作导致生成标识符。在将实体插入数据库之前,标识符不可能是可用的,而且由于实体的插入通常推迟到提交时,标识符在事务提交后才可用。“

您可以找到相应更新PostgreSQL表创建的解决方案,以便使用GenerationType.IDENTITY选项。

一个是在插入时生成的,另一个不是。一个在预科生中不为人所知,另一个为人所知。太好了。感谢您确认我对此的理解@迈克,请你把它标记为正确答案,这正是我想要的。我可以节省我的周末