Why is the Hibernate default generator for PostgreSql “SequenceGenerator”, not “IdentityGenerator”?
Hibernate中Postgresql的默认标识符生成器是SequenceGenerator [1]。
即,在对会话提交执行
但是,PostgreSql支持自动增量id列(参见例如[2]),并且支持自动增量的所有其他数据库的默认生成器是使用该功能[3],并执行省略id值的插入并查询数据库以获取新的id(在会话提交之前,但在会话的事务中)。
我已经看到最近的一些讨论[4]表明,由于插入前会话提交不匹配,前一策略总体上更好。
如果SequenceGenerator更好(根据[4]),为什么它不是支持它的数据库的默认值(见[3])?
如果IdentityGenerator更好,为什么Postgres支持前者时PostgreSql显式选择SequenceGenerator(按照[2])?
我试图找到重写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
也许是因为afterInsert生成器通常在NHibernate中为PG而被破坏,因为它使用了OracleStyle out-parameter样式,npgsql-ADONET驱动程序不支持该样式,它返回结果作为查询结果而不是out参数。
SQL:INSERT INTO ....将id返回到nhoutparameter; :nhoutparameter = null;
使用Oracle这是有效的
1 2 3 | command.Execute(); object id = command.Parameter["nhoutparameter"].Value; Assert.NotNull(id); |
在PG没有。 它应该是
1 | object id = command.ExecuteScalar(); |
这只是推测,因为我无法在postgres上找到好的功能/版本文档但是......
也许在串口实施之前添加了postgres方言,稳定,广泛使用,或者实施方言的开发人员都知道它。 更改方言的默认标识符生成器将是一个重大变化,那些是坏的。