Java Hibernate:manytone关系加载属于其他父对象的对象

Java Hibernate:manytone关系加载属于其他父对象的对象,java,oracle,hibernate,Java,Oracle,Hibernate,我正在努力解决我的申请中的一个问题: 基本上,我有一个类所有者,它有一个延迟加载的对象列表BucketOfRules,每个对象都包含一个规则列表EligibleRule。 通常,多个所有者将在数据库中拥有自己的BucketForules引用副本,这些副本保存了各自的关系。它们共享标识符列,但不共享ID列,ID列是主键 在代码中,我有一个验证器,每个“所有者a”的列表中不应该有超过2个BucketOfRules,但有时这种验证会被破坏,当我检查列表时,它将包含属于不同“所有者B”的BucketOf

我正在努力解决我的申请中的一个问题: 基本上,我有一个类所有者,它有一个延迟加载的对象列表BucketOfRules,每个对象都包含一个规则列表EligibleRule。 通常,多个所有者将在数据库中拥有自己的BucketForules引用副本,这些副本保存了各自的关系。它们共享标识符列,但不共享ID列,ID列是主键

在代码中,我有一个验证器,每个“所有者a”的列表中不应该有超过2个BucketOfRules,但有时这种验证会被破坏,当我检查列表时,它将包含属于不同“所有者B”的BucketOfRules的ID,尽管保存其所有者关系的BucketOfRules的内部字段设置为“所有者a”。 BucketForules是用fetch policy:subselect延迟加载的,hibernate触发的查询似乎是正确的:

select bucket0_.OWNER  bucket0_.ID as ID1_346_1_, bucket0_.ID as ID1_346_0_, bucket0_.IDENTIFIER as IDENTIFIER3_346_0_ 
from DB.FILTER_RULES bucket0_ where  bucket0_.TYPE=2 and bucket0_.OWNER in 
(select owner0_.ID from DB.OWNER owner0_ where owner0_.ID in (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) and owner0_.TYPE in (1, 2, 3))
我注意到,在hibernate登录时,检索到的对象是按标识符而不是按ID记录的,如果这很重要的话:

.sql.BasicExtractor - extracted value ([IDENTIFIER3_346_0_] : [VARCHAR]) - [Rules Agreement 'ABC 123' and Owners]
.sql.BasicExtractor - extracted value ([IDENTIFIER3_346_0_] : [VARCHAR]) - [Rules Agreement 'ABC 123' and Owners]
.sql.BasicExtractor - extracted value ([IDENTIFIER3_346_0_] : [VARCHAR]) - [Rules Agreement 'ABC 123' and Owners]
下面是java和hbm文件的片段:

Owner.java  
    @AuditMappedBy(mappedBy = "owner") //experimental hibernate annotation
    private List<BucketOfRules> bucketsOfRules = new ArrayList<>();

Owner.hbm.xml

    <bag name="bucketsOfRules" inverse="true" lazy="true" fetch="subselect"  cascade="all-delete-orphan">
            <cache usage="transactional"/>
            <key column="OWNER" foreign-key="none" />
            <one-to-many class="com.project.entity.BucketOfRules" />
    </bag>
    

BucketOfRules.java

    @XmlTransient
    private Integer id;
    @EntityIdentifier
    @XmlAttribute
    @XmlID
    private String identifier;
 @SojoPropertyFilter
    @XmlAttribute
    @XmlIDREF
    private Owner owner;
   @AuditMappedBy(mappedBy = "filterRules")
   private List<EligibleRule> eligibleRules = new ArrayList<>();
   @AuditMappedBy(mappedBy = "filterRules")
   private List<DefaultRule> defaultRules = new ArrayList<>();  
   
BucketOfRules.hbm.xml

    <subclass name="com.project.entity.BucketOfRules" extends="com.project.entity.AbstractBucketOfRules"
        discriminator-value="2" lazy="false">
        <many-to-one name="owner" column="OWNER" class="com.project.entity.Owner"
              lazy="false" fetch="select" cascade="none"/>
        <bag name="eligibleRules" inverse="true" lazy="true" fetch="subselect"  cascade="all-delete-orphan">
            <cache usage="transactional"/>
            <key column="FILTER_RULES" foreign-key="none" />
            <one-to-many class="com.finace.collateral.entity.EligibleRule" />
        </bag>
        <bag name="defaultRules" inverse="true" lazy="true" fetch="subselect"  cascade="all-delete-orphan">
            <cache usage="transactional"/>
            <key column="FILTER_RULES" foreign-key="none" />
            <one-to-many class="com.project.entity.DefaultRule" />
        </bag>
    </subclass>
Owner.java
@AuditMappedBy(mappedBy=“owner”)//实验性hibernate注释
private List bucketsOfRules=new ArrayList();
Owner.hbm.xml
BucketOfRules.java
@XmlTransient
私有整数id;
@实体标识符
@XmlAttribute
@XmlID
私有字符串标识符;
@SojoPropertyFilter
@XmlAttribute
@XmlIDREF
私人业主;
@审核映射规则(mappedBy=“filterRules”)
private List eligblerules=new ArrayList();
@审核映射规则(mappedBy=“filterRules”)
private List defaultRules=new ArrayList();
BucketOfRules.hbm.xml
我从不直接调用子类上的setter,至少在发生此问题时不会。我目前唯一的猜测是,在较低级别的缓存中,子选择的项集合被错误地分配给了所有者。我在多线程代码中执行对这些延迟加载列表的访问。 感谢您提供有关如何进一步调查的任何建议或步骤。我已经使用了P6Spy,但最终向DB发出的查询似乎没有问题,尽管确实一次为多个所有者加载列表