2009-12-11 32 views
1

我们正在开发一个使用Nhibernate作为数据访问层的应用程序。NHibernate和模块代码

我正在努力的事情之一是找到一种方法将2个对象映射到同一个表。

我们有一个适合数据输入的对象,另一个用于更多批处理过程。

该表包含数据条目的所有列和批处理过程的一些附加信息。

当它在一个批处理过程中,我不想加载所有的数据只是一个子集,但我希望能够更新表中的值。

nhibernate是否支持指向同一个表的多个对象?什么是允许这个的?

我之前尝试过,我记得如果你对其中一个对象进行查询,它会加载两倍的数量,但我不确定我没有错过任何东西。

例如

10的数据输入对象 + 10批次对象

所以20对象,而不是10

任何人都可以阐明这任何光?

我应该澄清一下,这些对象是2个不同的对象,在我看来,它们在行为上不应该是多态的。但是,它们确实指向相同的数据库记录,更多的是该记录在应用程序中具有双重用途,并且为了逻辑分区,它们应该保持独立。 (更改一个域对象不应该炸毁其他模块中的大量屏幕等)。

由于 皮特

+1

我希望它只能在两张映射到同一个表上。你可以试试这个,并确认这种方法的任何明确的问题? –

+0

约翰,我会再试一次,我敢肯定,我已经尝试过这一点,但我不确定是否它的行为作为从批处理对象继承的数据输入对象,我必须仔细检查,它可能是我的记忆很糟糕! – Peter

回答

1

一个简单的方法将多个对象映射到相同的表是通过使用一个识别器字段。在表中添加一个额外的列,并让它包含一个值,将其声明为类型“数据输入”或“批处理”。

您会创建两个对象 - 一个用于数据输入和批处理。我不完全相信你如何制定,在常规NHibernate的XML映射 - 我用的ActiveRecord城堡为注释,所以你标记你的对象,像这样:

[ActiveRecord("[Big Honking Table]", 
    DiscriminatorColumn = "Type", 
    DiscriminatorType = "String", 
    DiscriminatorValue = "Data Entry")] 
public class Data Entry : ActiveRecordBase 
{ 
    //Your stuff here! 
} 

[ActiveRecord("[Big Honking Table]", 
    DiscriminatorColumn = "Type", 
    DiscriminatorType = "String", 
    DiscriminatorValue = "Batch Process")] 
public class Batch Process : ActiveRecordBase 
{ 
    //Also your stuff! 
} 

下面是与NHibernate做它的方式+ Castle ActiveRecord:http://www.castleproject.org/activerecord/documentation/trunk/usersguide/typehierarchy.html 请注意,他们使用父对象 - 我不认为这是必要的,但我没有完全按照您描述的方式实现鉴别器列,所以它可能是。

下面是在XML映射:https://www.hibernate.org/hib_docs/nhibernate/html/inheritance.html

您还可以通过映射,让NHibernate的知道哪些列装载/更新 - 如果你最终只是让一个大的对象。

+0

如果它们不是数据库中的相同记录,则这将起作用,但是这两个对象将使用相同的记录,只是有效地使用两种模式。 我以前用过其他多态行为的描述符,这只是不符合多态类的行为。 这些是两个独立的类,它们是db中的相同记录,它们可能有3个属性/列彼此相同。 – Peter

+0

我更新了原来的帖子,以包含这些额外的信息,我没有在第一篇文章中解释清楚。 – Peter

+0

啊,好吧。我会同意上面John的评论,然后 - 只是将两个不同的对象映射到同一个表,并且只包含某些列 - 而不是另一个的子类。 –

0

我想你也许会被过度设计,它只是一点点:

  • 如果你担心性能,这是不成熟的优化(此外,检索少列是快不了多少,为节约您可以启用动态更新仅更新已更改的列)。
  • 如果你试图通过锁定他的选择来保护程序员免受自己的伤害,那么你的设计就不那么高尚了。

总之,根据我10年以上的经验和对您的问题的了解有限,我建议您再想一想做你想做的事情。

+0

感谢您的意见,但我不觉得我在过度设计这一点,因为性能不仅要考虑速度,还要考虑传输时间,消耗的内存量,为什么要读取15当你需要时将字符串转换成内存。 我不想锁定选择我试图确保应用程序是模块化的,因为一些要求意味着我们的客户希望重新编写部分以使它们工作到他们的工作流程等 – Peter