- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们最近升级到最新版本的 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/
我有一个案例,在大多数情况下,对象之间的关系是这样的,因此在关系上预先配置一个渴望(加入)的负载是有意义的。但是现在我遇到了一种情况,我真的不想完成急切的加载。 我是否应该从关系中删除连接负载并将所有
在我的 Grails 项目中,我有以下类: class A { static hasMany = [cs:C] } class B { static hasMany = [cs:C]
想象一下以下简化的 DI 模型: @ApplicationScoped public class A { private B b; @Inject public A(B b)
我使用 MapLoader 将数据从数据存储初始加载到 Hazelcast (InitialLoadMode = EAGER)。我需要从一个物化 View 中加载这些数据,该 View 是为了在加载过
我使用 Hibernate Envers 4.3.10.Final。我有以下两个 JPA 类: public class Factory { private int factoryID;
EJB 似乎被延迟加载 - 每当访问时。 但是,我想急切地初始化它们 - 即每当容器启动时。这是如何实现的(尤其是在 JBoss 中) This topic给出了一些提示,但不是很令人满意。 最佳答案
我是一名优秀的程序员,十分优秀!