2012-02-27 116 views
7

Hibernate中Postgresql的默认标识符生成器是SequenceGenerator [1]。 即Hibernate将做SELECT nextval('hibernate_sequence')以在会话提交之前执行INSERT foo (id, ...) VALUES (123, ...)之前生成ID。但是,PostgreSql支持自动增量id列(例如参见[2]),并且所有其他支持自动增量的数据库的缺省生成器都是使用该功能[3],并执行插入,省略id值并进行查询用于新id的数据库(在会话提交之前,但在会话的事务中)。为什么PostgreSQL“SequenceGenerator”,而不是“IdentityGenerator”的Hibernate默认生成器?

我已经看到一些最近的讨论[4],表明前一策略总体上更好,因为insert-before-session-commit不匹配。

如果SequenceGenerator更好(按[4]),为什么它不支持它的数据库的默认值(见[3])?

如果IdentityGenerator比较好,为什么PostgreSql在Postgres支持前者(按[2])时显式选择SequenceGenerator?

我试图找到重写默认Postgres方言的决定的历史(见[1]),但我无法在GitHub中找到相关的提交。我已经将代码追溯到SVN存储库,但是在r11563添加PostgreSQLDialect文件并且无用的提交消息“maven migration”[5]的情况下,该线索变得很冷。我似乎无法追溯历史。任何人都可以找到增加了这个覆盖的提交?也许在提交消息中有更多的信息。

在此先感谢。

[1] https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/main/java/org/hibernate/dialect/PostgreSQL81Dialect.java#L267

[2] PostgreSQL Autoincrement

[3] https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/main/java/org/hibernate/dialect/Dialect.java#L639

[4] http://nhforge.org/blogs/nhibernate/archive/2009/03/20/nhibernate-poid-generators-revealed.aspx

[5] https://source.jboss.org/browse/Hibernate/core/trunk/core/src/main/java/org/hibernate/dialect/PostgreSQLDialect.java?focusedRev=14993&fromRev=11563&toRev=14993#r14993

+3

我想这是因为'serial'数据类型只是一个“伪装序列”。 – 2012-02-27 18:51:59

+0

这并不能解释它 - 所有自动增量列都是伪装的序列。 – Rich 2012-02-28 09:04:38

+0

不,不适用于SQL Server或MySQL,如果不进行插入操作就无法获得下一个值(这是基于序列的解决方案和“自动递增”之间的最大区别) – 2012-02-28 17:11:03

回答

2

也许是因为afterInsert生成器在NHibernate中通常会打破PG的原因,因为它使用了OracleStyle的out-parameter风格,而npgsql-ADONET驱动程序不支持该风格,它返回结果作为查询结果而不是out参数。

SQL:INSERT INTO ....返回id到nhoutparameter; :nhoutparameter = null;

使用Oracle这部作品

command.Execute(); 
object id = command.Parameter["nhoutparameter"].Value; 
Assert.NotNull(id); 
在PG

没有。它应该是

object id = command.ExecuteScalar(); 
+0

这对NHibernate很有意义。你知道,如果同样适用于Hibernate? – Rich 2012-02-29 10:53:12

+0

也许。我没有环境来测试。对于NH,我刚刚获得了源代码,并针对PG运行了UnitTests。所有postInsertGenerator测试失败。你可以用github上的Hibernatesource来对抗PG。 – Firo 2012-02-29 11:04:14

0

这是因为我只是猜测不能在postgres上找到好的功能/版本文档,但...

也许postgres方言是在系列实现之前添加的,稳定的,广泛使用的,或者实现方言的开发者意识到的。改变一个方言的默认标识符生成器将是一个突破性的改变,这些都是不好的。

相关问题