2

我手上有一个问题,我花了几天时间寻找答案无济于事......

我们正在使用 HiLo Id 生成,只要实体表与 hibernate_unique_key 表在同一架构中,一切似乎都工作正常。

表结构非常简单。我在 db 中有我的 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 时,我得到一个“已经添加了具有相同密钥的项目”。错误。所以现在我有点卡住了。我不能在没有模式的情况下离开 HiLo 生成器,因为它从类中获取模式,并且我无法指定模式,因为它已经被添加(大概是因为它是我的 XML cfg 文件中标识的“default_schema” )。

我在这里完全被冲洗了吗?我必须要么

A) 将我的所有表保存在 dbo 模式中或

B)为数据库中的每个唯一模式创建一个单独的 HiLo Key 表?

这两种情况都不是特别适合我的应用程序,所以我希望我可以“修复”我的映射文件来解决这个问题。

4

3 回答 3

2

您是否尝试过在所有生成器上使用表名指定模式(包括已经在 dbo 模式中的那些?即

<param name="table">dbo.hibernate_unique_key</param>

hilo 生成器查找“.”。在表名中,并且仅在不存在时才对其进行限定(使用模式)。

于 2011-03-03T19:24:43.303 回答
2

每个数据库应该只存在一个这样的表。此类数据表应隐含以下列(我们称此表为参数):

HiLoId
TableName
ParamName
HiLoAssigned

除了用作 HiLo 分配数据表之外,它还可以用作参数表。因此,ParamName 字段是必需的。这可能包含以下数据:

HiLoId | TableName | ParamName | HiLoAssigned
---------------------------------------------
   1   | Parameters| HiLoId    |       3
   2   | Customers | CustomerId|    9425 
   3   | Invoices  | InvoiceId |  134978

当您需要一些其他参数时,例如用于修剪历史表的作业的参数,则可以将记录的年龄参数插入其中。

好吧,我在这个主题上比你实际问的要深入一点。只是分享一些关于数据库设计/架构的额外想法。

仔细看看this question,看看我的回答。这也可能会回答您的问题,并为该答案带来更多信息。

于 2010-06-11T17:41:12.627 回答
1

我认为解决方案B没有任何问题。行为将几乎相同。

于 2010-06-11T17:04:06.207 回答