我手头上有一个问题,我花了几天时间寻找答案但无济于事......
我们正在使用 HiLo Id 生成,只要实体表与 hibernate_unique_key 表处于相同的架构,一切似乎都工作正常。
表结构非常简单。我的 hi 值表在数据库中为 dbo.hibernate_unique_key。几个实体表也在 dbo 架构中,并且它们工作没有问题。然后我们在“Contact”模式下有表(例如 Contact.Person 和 Contact.Address)。
在人员映射文件中:
<class name="Person" table="Person" schema="Contact">
<id name="Id" unsaved-value="0">
<generator class="hilo">
<param name="max_lo">100</param>
</generator>
</id>
...
当我尝试插入 Person 实体时,收到错误“无效的对象名称 'Contact.hibernate_unique_key'”。该错误肯定足够清楚。所以我添加:
<param name="schema">dbo</param>
到我的映射文件/生成器元素。现在,当构建 SessionFactory 时,我收到“已添加具有相同 key 的项目”。错误。所以现在我有点卡住了。我不能让 HiLo 生成器没有模式,因为它从类中获取模式,并且我无法指定模式,因为它已经被添加了(大概是因为它是我在 XML cfg 文件中标识的“default_schema”) )。
我在这里彻底崩溃了吗?我必须这样做吗
A) 将我的所有表保留在 dbo 架构中或
B) 为数据库中的每个唯一模式创建一个单独的 HiLo Key 表?
这两种情况对于我的应用程序来说都不是特别合适,所以我希望我可以“修复”我的映射文件来解决这个问题。
最佳答案
每个数据库只能存在一个这样的表。这样的数据表应该包含以下列(我们将此表称为参数):
HiLoId
TableName
ParamName
HiLoAssigned
除了用作 HiLo 分配数据表外,还可以用作参数表。因此,ParamName 字段是必需的。这可能包含以下数据:
HiLoId | TableName | ParamName | HiLoAssigned
---------------------------------------------
1 | Parameters| HiLoId | 3
2 | Customers | CustomerId| 9425
3 | Invoices | InvoiceId | 134978
当您需要一些其他参数时,例如会修剪表历史记录的作业参数,则可以将记录的年龄参数插入其中。
嗯,我对这个主题的了解比你实际问的要深入一些。只是分享一些数据库设计/架构方面的额外想法。
留意this question
,并在那里查看我的答案。这也可能回答您的问题,并为此答案提供更多信息。
关于NHibernate HiLo 生成和 SQL 2005/8 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3023917/