Hibernate身份映射模式

时间:2014-11-24 03:44:39

标签: domain-driven-design

我正在尝试在胖客户端中使用DDD实现一个系统,并且在大多数情况下,它似乎工作得很好。不幸的是,我对DDD的体验主要是在Web系统中,实体很长时间没有保存在内存中。因此,我不习惯在内存中处理具有相同“身份”的多个对象的问题。

为解决这些问题,我尝试按照Martin Fowler的描述实现Identity模式。但是,我很难相信我认为是一个基本问题。 这是我的实现失败的情况,并希望有一些关于如何以干净的方式执行它的输入。

我有2个存储库。一个用于对象A,一个用于对象B.

对象A聚合对象B的列表(子集)。但是,它不“拥有”B(它不是B的聚合根)

如果我查询存储库以检索对象A,则存储库将A放在地图中,并将“自动”创建对象B. (在我的例子中,我使用Hibernate作为ORM。因此,Hibernate将急切地加载对象列表B并且它们不会存储在地图中。)

现在,如果我需要查询存储库B以获取所有对象B.我将在内存中获得重复。

因此,我的问题是只有直接查询存储库的对象才会进行“身份映射”检查。这些对象的引用超出了模式的范围......或者看起来如此。

我现在修复此示例的唯一方法是在对象A中创建一个循环,以便在Hibernates返回后在对象中创建对象B.如果它们已经存在,则将引用重新链接到映射中的现有实体,并丢弃由Hibernate创建的实体。

我认为这是一个糟糕的模式实现,因为我必须撤消Hibernate在某些情况下为我做的工作。

也许我应该在这种情况下使用延迟加载?但即便如此,Hibernate也不会知道我的身份地图,据我所知,我会遇到同样的问题。

任何人都知道实现这个的好方法吗?

注意:在我的情况下,Hibernate位于后端服务器上而不是胖客户端本身。因此,我无法使用“内置”的hibernate身份映射。

谢谢!

0 个答案:

没有答案