Ric*_*ich 8 postgresql nhibernate hibernate identity-column
Hibernate中Postgresql的默认标识符生成器是SequenceGenerator [1].即Hibernate将SELECT nextval('hibernate_sequence')在执行INSERT foo (id, ...) VALUES (123, ...)会话提交之前生成ID .
但是,PostgreSql支持自动增量id列(参见例如[2]),并且支持自动增量的所有其他数据库的默认生成器是使用该功能[3],并执行省略id值的插入并查询数据库以获取新的id(在会话提交之前,但在会话的事务中).
我已经看到最近的一些讨论[4]表明,由于插入前会话提交不匹配,前一策略总体上更好.
如果SequenceGenerator更好(根据[4]),为什么它不是支持它的数据库的默认值(见[3])?
如果IdentityGenerator更好,为什么Postgres支持前者时PostgreSql显式选择SequenceGenerator(按照[2])?
我试图找到重写Postgres方言中默认值的决定的历史(见[1]),但我在GitHub中找不到相关的提交.我已经将代码跟回到SVN存储库,但是在r11563中添加了PostgreSQLDialect文件,其中有一条无用的提交消息"maven migration"[5].我似乎无法再追溯历史了.任何人都可以找到添加此覆盖的提交吗?也许提交消息中有更多信息.
提前致谢.
[4] http://nhforge.org/blogs/nhibernate/archive/2009/03/20/nhibernate-poid-generators-revealed.aspx
也许是因为 NHibernate 中的 PG 的 afterInsert 生成器通常会被破坏,因为它使用 OracleStyle 输出参数样式,而 npgsql-ADONET 驱动程序不支持该样式,该驱动程序将结果作为查询结果而不是输出参数返回。
SQL: INSERT INTO .... 将 id 返回到 nhoutparameter 中;:nhout参数 = null;
使用 Oracle 这是可行的
command.Execute();
object id = command.Parameter["nhoutparameter"].Value;
Assert.NotNull(id);
Run Code Online (Sandbox Code Playgroud)
在PG中则不然。它应该是
object id = command.ExecuteScalar();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2695 次 |
| 最近记录: |