开发者

NHibernate: Change from lazy=true to fetch=join brings back the world

开发者 https://www.devze.com 2022-12-08 02:09 出处:网络
I have a User object/mapping in my application. Each user has a list of contact information (phone, email etc)

I have a User object/mapping in my application. Each user has a list of contact information (phone, email etc)

the mapping for the user contains:

<bag name="ContactInfo" table="contact_info" lazy="true" cascade="all">
    <key column="contact_id"/>
    <one-to-many class="...ContactInfo, ..."/>
</bag>

this works fine but i get the n+1 select problem so i need to optimize it a little bit. But for some reason, when I change this to a join and perform some db operation, NH starts updating ALL contact_info objects in the database. When i say db operation i dont mean changinf a contact. i mean anything.

Anyone knows why? thx

EDIT: Just realized that it does it for lazy="true" as well but the second time, after the obje开发者_运维百科cts have been loaded. the question of why remains


I'm wondering if your cascades are causing the issue. Do you have cascade=all on your entire graph? If so you may want to re-evaluate your lifecycle strategy.

Here's a though from section 9.9 of NHibernate 1.2 reference (emphasis added)

Mapping an association (many-to-one, or collection) with cascade="all" marks the association as a parent/ child style relationship where save/update/deletion of the parent results in save/update/deletion of the child(ren). Futhermore, a mere reference to a child from a persistent parent will result in save / update of the child.


it turns out that an enum field in ContactInfo was the problem. i didnt mind if that particular filed was a string so changing it resolved this issue.

0

精彩评论

暂无评论...
验证码 换一张
取 消