2008-11-11 78 views
6

我对NHibernate相对比较陌生,但一直在使用它的最后几个程序,我恋爱了。我遇到了需要将4-5个数据库中的数据汇总到一个数据库中的情况。具体是序列号数据。每个数据库都有自己的映射文件,但最终实体都共享相同的基本结构(串行类)。我知道NHibernate想要每个类的映射,所以我最初的想法是有一个基本的串行类,然后从它继承每个不同的数据库,并创建一个唯一的映射文件(继承类将有零内容)。这对抓取所有数据和填充对象应该很有用。然后我想要做的就是使用基类映射将这些继承的类保存到基类表中(不确定适当的术语是什么)。NHibernate:一个基类,几个映射

问题是我不知道如何强制NHIbernate使用对象的特定映射文件。在使用'session.save()'(它抱怨没有映射)时,将继承的类转换为基类不会执行任何操作。

有没有明确指定要使用哪个映射的方法?还是只有一些OOP主体我失踪,更具体地将继承类转换为基类?或者这个想法不好。

关于NHibernate(第8章),我可以找到的所有继承东西似乎都不适用于此函数,但我可能是错的(每个具体类的表看起来可能很有用,但是我无法将它的头围绕在NHibernate的计算结果中)。

回答

4

我不知道这是否会有所帮助,但基本上我不会这么做。基本上,我认为你可能患有“戈尔德锤子”综合征:当你有一个真正很好的锤子(即休眠(和我分享你的意见;它是一个MAGNIFICENT工具)),一切看起来像钉子。我一般会尝试简单地有一个“手动转换”类,即一个具有构造函数的构造函数,这些构造函数为您的各个串行类使用hibernate类,并简单地将数据复制到它自己的特定格式;那么Hibernate可以简单地使用自己的映射将其序列化到(单个)数据库。

实际上,我认为这是一个更好的解决方案的原因是,你有效地试图做的是在你的班级中有不对称序列化;即从派生类中的一个数据库中读取数据,然后写入基类中的另一个数据库。没有什么太可怕的,真的,除了它基本上是一个单向的过程;如果您真的想从一个数据库转换到另一个数据库,只需执行转换,然后解决它。

+0

是的,我同意,这是有道理的。我希望得到一颗银弹,但你提到的将会完美地工作。 – anonymous 2008-11-12 03:22:16

2

这可能有帮助;

Using NHibernate with Multiple Databases

来自文章;

介绍

... 使用NHibernate与ASP.NET 描述;它提供了与单个数据库进行通信的指导方针 。 但有时需要 与多个数据库 同时通信。对于NHibernate做 这个,会话工厂需要存在 为每个数据库,你将与 通信。但是,如同经常有多个数据库的情况下 的数据库很少使用。所以 它可能是一个好主意,不建立 会话工厂,直到他们实际上需要 。本文摘自 ,其中前面的NHibernate带有 的ASP.NET文章,并且描述了 这个 简单声音方法的实现细节。虽然前面的文章 关注ASP.NET, ,但ASP.NET和.NET的 均支持以下建议。

...

使用多个数据库 时做的第一件事就是 配置适当的通信。 为每个 数据库创建一个单独的配置文件,将它们全部放入中心 config文件夹,然后从web/app.config中引用它们 。

...

0

我不是100%肯定这会做什么,我需要,但我发现这个谷歌搜索今天关于NHibernate和匿名类型:

http://infozerk.com/averyblog/refactoring-using-object-constructors-in-hql-with-nhibernate/

的有趣的部分(对我来说,我是新手)是HQL select子句中的'new'关键字。所以我可以做的是使用mappingX从DatabaseX中选择SerialX,并将其传递给SerialY(通用/基本串行)的构造函数。所以现在我从mappingX/databaseX生成了SerialY,并且(希望)我可以使用session.save,并且NHibernate将使用mappingY/databaseY。

我喜欢这个的原因是根本没有两个具有相同数据的类持久化(我想!)。这与真正没有功能差异,并返回一个SerialX列表,迭代并产生SerialY并将其添加到一个新的列表(第一个和最好的答案给出)。

这并没有为继承的NHibernate映射提供有用的案例更普遍的好处,但我认为它会做我想要的有限的东西。

0

虽然这是真的,但您需要每个表的映射文件/类,但没有任何东西阻止您让所有这些类实现通用接口。

然后,您可以聚集所有这些汇集成一个单一的集合在应用程序层(即目录),其中每个这些类的实现List)

你可能会写一些管道跟踪哪个会话,就可以如果您希望更新,请将其存储在(因为您要定位多个数据库)。但是,这样做的过程会因您设置的方式而有所不同。

0

我写了一个非常长的帖子,里面有代码和所有对Dan的回应。它结束了,我想我错过了显而易见的。

public class Serial 
{ 
    public string SerialNumber {get; set;} 
    public string ItemNumber {get; set;} 
    public string OrderNumber {get; set;} 
} 

...

Serial serial = sessionX.get(typeof(Serial), someID); 
sessionY.save(serial); 

NHibernate的应该使用mappingX为get和mappingY的保存,因为会话没有被共享,并且映射是联系在一起的会话。所以我可以有2个映射指向同一个类,因为在任何特定的会话中,只有一个到类关系的映射。

至少我认为是这样(不能测试atm)。

不幸的是,这个具体案例真的很无聊,没用。在同一个域中的不同程序中,我从业务逻辑的特定部分的基类中派生出来。我不想创建映射文件,因为它只是简化一小段代码。无论如何,由于与我的第一个问题相同的原因,我无法在NHibernate中工作,并且确实采用了McWafflestix描述的解决方法(因为它很小)。

这就是说我已经通过谷歌发现这一点:

http://jira.nhibernate.org/browse/NH-662

这是完全一样的情况下,它似乎(可能)在NH 2.1+解决?我还没有跟进。我注意到你对接口的建议,因为我认为这是其他情况的一个好主意,你会定义一个接口吗?对接口的映射?如果我尝试并保存一个实现了没有映射定义的接口的类,NHibernate会使用接口映射吗?或者我必须在映射中为每个实现了这个接口映射的类声明空sublcasses接口映射?)

相关问题