3

我在经销商和卖家之间建立了一对一的关系,应该懒惰地使用代理。对于定义外键的一方(卖方,引用经销商),这很好用。但从另一方面来说它不起作用——卖家总是急切地加载。我按照“关于延迟加载的一些解释”constrained="true"中的描述进行设置,但这并没有帮助。

以下是使用的映射:

<class name="Role" table="PER_PERSROLE" abstract="true">
    <id column="OID" type="long">
        <generator class="native" />
    </id>
    <discriminator column="SUBTYPE" type="string" />
</class>

<subclass name="Dealer" extends="Role" discriminator-value="DEAL">
    <property name="gpNr" column="GP_NR" type="string" />
    <one-to-one name="seller" property-ref="dealer" lazy="proxy" constrained="true"
        outer-join="false" />
</subclass>

<subclass name="Seller" extends="Role" discriminator-value="SELL">
    <many-to-one name="dealer" column="SELLER_DEALEROID" lazy="proxy"
        outer-join="false" />
</subclass>

两个类都驻留在一张表中是否有问题?我看到严格来说,关系不受数据库的限制(它不能使用这个模型),但是域模型总是需要两个实体,应用程序可以确保这一点。

4

2 回答 2

1

我认为您链接到的页面解释得最好,尽管我不确定为什么它建议设置constrained="true". 如果您在数据库级别考虑它,Hibernate 无法在不访问数据库的情况下判断给定属性(经销商的卖家)是否应该为空(它需要执行 aSELECT ... WHERE OID=:sellerOrDealerId以查看是否返回任何行)。当它访问数据库时,它也可能会获取该行的其余部分。从关联的另一端(卖方的经销商)来看,没有这样的问题,因为它已经获取了行(以及SELLER_DEALEROID列)。

我确实遇到过类似的事情,并且能够通过使关联成为非可选(错误,不可为空)来解决它

于 2009-06-11T18:14:05.403 回答
0

我猜你正在加载 session.get(id)?您是否尝试过使用 HQL 查询加载实例?这将允许您在查询中指定急切或延迟加载的关系。

高温高压

于 2009-05-22T22:45:17.790 回答