gpt4 book ai didi

Nhibernate:只读属性导致急切加载

转载 作者:行者123 更新时间:2023-12-04 00:53:48 25 4
gpt4 key购买 nike

我们最近升级到最新版本的 NHibernate (3.3.3.4001),我遇到了 NHibernate 2.1.2.4000 中不存在的问题。这让我相信这可能是新的内置字节码提供程序的问题。

考虑以下映射:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Foo.Core.Domain" assembly="Foo.Core" default-access="property">
<class name="EntityA" table="EntityA" lazy="true">

<id name="Id" column="EntityAId">
<generator class="native" />
</id>

<many-to-one name="EntityB" column="EntityBId" class="EntityB" not-null="true" />
<many-to-one name="EntityC" column="EntityCId" class="EntityC" not-null="true" access="readonly" insert="true" update="false" />


</class>
</hibernate-mapping>


<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Foo.Core.Domain" assembly="Foo.Core" default-access="property">
<class name="EntityB" table="EntityB" lazy="true">

<id name="Id" column="EntityBId">
<generator class="native" />
</id>

<many-to-one name="EntityC" column="EntityCId" class="EntityC" not-null="true" />

</class>
</hibernate-mapping>

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Foo.Core.Domain" assembly="Foo.Core" default-access="property">
<class name="EntityC" table="EntityC" lazy="true">

<id name="Id" column="EntityCId">
<generator class="native" />
</id>


</class>
</hibernate-mapping>

这是我对 EntityA 的类定义:

Public Class EntityA

Public Overridable Property Id As Integer

Public Overridable Property EntityB As EntityB

Public Overridable ReadOnly Property EntityC As EntityC
Get
Return If(EntityB IsNot Nothing, EntityB.EntityC, Nothing)
End Get
End Property


End Class

当我为 EntityA 的实例调用 Session.Get 时存在问题 - 它会立即导致也为其相应的 EntityB 发出选择:

Session.Get(Of EntityA)(id) ' Causes the EntityB that EntityA references to be loaded as well.

我最好的猜测是字节码提供程序导致在构建代理时评估我的只读“EntityC”属性,这会强制加载引用的 EntityB。

有什么方法可以避免在 NHibernate 3.3.3 中使用这种类型的模型时发生急切加载?

最佳答案

我在 NH 3.3.3 SP1 上对此类层次结构和映射进行了一些测试,这是我的观察结果:

  • 使用 session.Get<> 加载实体 A ,然后对对象做一些事情在不触及属性 EntityB、EntityC、EntityB 的情况下不被加载。触摸任一属性将触发查询当然,这很正常。

  • 加载 EntityA,更新与属性无关的内容EntityB 和 EntityC 喜欢更改 EntityA 名称,然后回滚事务,没有发出额外的 SELECT。

  • 加载 EntityA,什么也不做,然后提交事务,第二个 SELECT为 EntityB 颁发。

  • 加载 EntityA,用 session 做一些查询,然后说 SELECT为 EntityB 发布了。

所有测试都在 FlushMode.Auto 下完成。

从这些,我得出了 NHibernate 在这种情况下的行为完全符合预期的结论:在进行刷新时,NH 需要检查对象是否脏,它需要获取属性 EntityC 的值以与之前的值进行比较,这就是触发相关 SELECT 的原因。

绝对不是因为session.Get<>或新代理。您可以轻松地进行更多测试来证明这一点。不过,我不明白为什么 NH 2.1.2 会有所不同。

我也在 NH 3.3.1 上进行了测试,响应与 NH 3.3.3 SP1 完全相同。

关于Nhibernate:只读属性导致急切加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18763786/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com