2009-07-21 87 views
0

我有一个使用关联表和cascade =“save-update”的两个实体之间定义的多对多关系。NHibernate额外更新查询运行

实体1包含实体2的列表,相反,实体2包含实体1的列表。从这个worflow输出的SQL似乎确定...

  1. 创建ENTITY1和ENTITY2对象
  2. 添加到ENTITY2名单上ENTITY1
  3. 呼叫session.Save上ENTITY1

- >插入语句针对两个实体运行,然后插入关联表中的记录将它们链接在一起。

但是,如果ENTITY2我第一呼叫session.Save,将其添加到列表中,然后调用session.Save上ENTITY1还有一个额外的UPDATE语句运行其将所有ENTITY2的价值观,以完全一样的东西被插入在开始处。

虽然不会引起任何问题,但它是一种额外的查询降低性能。我玩过逆向属性,但这并不能消除额外的更新语句。目前双方都有inverse =“false”,因为无论保存哪个实体,我都希望更新关联表。

任何想法?

回答

0

感谢您的回应,但我相信我发现了这个问题。我为每种执行CRUD操作的实体都有一个存储库类。每个CRUD操作开始它自己的会话/事务,称为保存/更新/等,然后关闭事务/会话。

如果我调用session.Save为Entity2然后session.Save为Entity1(其中包含Entity2的列表)NH似乎知道它已经在会话中持久Entity2,因此不会尝试更新记录。另一方面,如果我为一个单独的会话/事务调用session.Save为Entity2然后session.Save为Entity1,它希望再次更新Entity2。我是NH新手,所以不确定它如何跟踪哪些对象需要更新,但它必须在会话之间重置?

有点让我很好的DDD存储库没有多大用处!也许仓库应该使用单例会话或类似的东西来避免这个问题?

感谢, 约翰

+0

只记得一个会话不是线程安全的。我认为大多数人在aspnet中使用'Session-per-request'或者在应用程序中使用'session-per-thread' – 2009-07-21 06:23:04

0

来自文档: inverse(可选 - 默认为false):如果启用,Hibernate不会尝试插入或更新由此连接定义的属性。

我的建议是:在某些情况下,以防止2路附加更新加入两个集合可能需要更新:

Contact c; 
Address a;  
c.Addresses.Add(a); 
a.Contacts.Add(c); 

你可能会得到额外的更新语句,因为双方都有逆=假并且第一个实体的关系列表被保存为空。新罕布什尔州只做它认为需要的东西,以便更新所有关系。