1

我正在使用 Oracle 中的旧数据库,并且我的一些表的列设置为 NOT-NULL,这是我在域模型中不想要的,但是,显然,我需要指定至少一些默认值的地方被保存到数据库中(例如,组表可能有一个“缩进”列 thaqt 总是需要一个 char(8) 值)。

我将如何在 NHibernate 中解决这个问题?是否有捷径可寻?如果没有,有没有人知道我可以做到这一点的方法(我考虑过使用 Inteceptor,但真的不知道从哪里开始......)。我无法更改数据库架构,所以遗憾的是,这不是一个选项(流利的版本也可以......)。

4

5 回答 5

5

如果你不想污染你的 POCO,拦截器可能是最好的选择。看看关于拦截器的各种文章,比如这个

在您的拦截器上,您需要检查类型,以便知道将虚拟数据放入哪些字段。确保在 OnFlushDirty 方法中使用 currentState[](OnFlushDirty 是“更新”)和在 OnSave 方法中使用 state[]( “插入”)。例如(OnSave):

if (entity is Group)
{
    state[Array.IndexOf(propertyNames, "Indentation")] = "dummy value";
    return true;
}
return false;

编辑:

您正在尝试插入您的域中不存在但您的数据库模型需要的数据,因此上述方法对您不太适用。相反,您必须向每个 state、propertyNames 和 types 数组添加一个元素。

于 2009-02-24T00:06:48.993 回答
1

您可以使用自定义 CRUD sql,在 java 中我会说具有属性默认值的私有设置器也可以工作

于 2009-02-24T00:03:39.907 回答
0

NHibernate 的答案是实现IInterceptor

于 2009-02-24T00:07:12.330 回答
0

还有一种使用 IPropertyAccessor 接口的替代方法,请参见http://elegantcode.com/2009/07/13/using-nhibernate-for-legacy-databases/

于 2011-08-26T07:43:38.290 回答
0

我一直认为最好通过为列指定默认值来解决此类问题。

这样你就可以忘记它,而不是实现一些拦截器,这甚至听起来很可怕。

下面是示例 SQL 代码:alter table with default value

我猜即使 DB 是遗留的,你也可以控制它,因为你可以插入新行。这是非常便宜且轻量级的解决方案。

于 2011-09-26T17:38:43.297 回答