我有一个一对一的经销商和卖家之间的关系,这应该是懒惰的使用代理。对于定义外键的那一侧(卖方,引用经销商),这种方法工作得很好。但从另一方面看,它并不起作用--卖家总是急切地装货。我按照"Some explanations on lazy loading"中的描述设置了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>两个类都驻留在一个表中有问题吗?我看到,严格地说,关系不受数据库的约束(它不能使用这个模型),但是域模型总是需要这两个实体,并且应用程序确保了这一点。
发布于 2009-06-11 18:14:05
我认为你链接到的页面解释得最好,尽管我不确定为什么它会建议设置constrained="true"。如果在数据库级别上考虑,Hibernate无法在不访问数据库的情况下判断给定属性(交易者的卖家)是否应该为null (它需要执行SELECT ... WHERE OID=:sellerOrDealerId以查看是否返回任何行)。而且,当它访问数据库时,它可能还会提取行的其余部分。从关联的另一端(卖方的经销商)来看,没有这样的问题,因为它已经获取了行(因此也获取了SELLER_DEALEROID列)。
我确实遇到过一次类似的情况,并且能够通过使关联成为非可选的(err,不可为non)来解决它。
发布于 2009-05-22 22:45:18
我猜你在加载session.get(id)?您是否尝试过使用HQL查询加载实例?这将允许您在查询中指定要立即加载或延迟加载的关系。
HTH
https://stackoverflow.com/questions/838894
复制相似问题