Java Hibernate仅加载查询集合的一个对象

Java Hibernate仅加载查询集合的一个对象,java,sql-server,hibernate,Java,Sql Server,Hibernate,几天前,我在冬眠中遇到了一个奇怪的行为,我说不出为什么它突然出现 有两个表共享单向1:n关系。存在包含n条记录的记录目录。在这种情况下,我无法发现只加载了一条记录。没有出现任何错误消息。也没有警告 事实上,这是很容易的事情,总是有用的。(本公告末尾的对象代码) 到目前为止,我只能说,如果记录目录的ID为78,则只会加载一条记录。对于其他ID,它似乎没有问题 我正在获取我的RC对象,如下所示: public String getCatalog(){ Session session = null;

几天前,我在冬眠中遇到了一个奇怪的行为,我说不出为什么它突然出现

有两个表共享单向1:n关系。存在包含n条记录的记录目录。在这种情况下,我无法发现只加载了一条记录。没有出现任何错误消息。也没有警告

事实上,这是很容易的事情,总是有用的。(本公告末尾的对象代码)

到目前为止,我只能说,如果记录目录的ID为78,则只会加载一条记录。对于其他ID,它似乎没有问题

我正在获取我的RC对象,如下所示:

public String getCatalog(){
Session session = null;

    try {

        SessionFactory factory = HibernateUtil.getSessionFactory();
        session = factory.openSession();
        Transaction tx = session.beginTransaction();
        String hql = "SELECT R FROM rcatalog.Rcatalog as R WHERE rcatalogID_PK = " + rcid;
        Query query = session.createQuery(hql);
        return getOutputForPage(query.list().get(0)); //If I get the size of the records it's 1 here

    } catch (HibernateException | java.lang.IndexOutOfBoundsException hibex) {
        Logger.getLogger(BasisHibernate.class.getName()).log(Level.INFO, "Rcid: {0}", rcid);
        Logger.getLogger(BasisHibernate.class.getName()).log(Level.SEVERE, null, hibex);
    } finally {
        try {
            if (session != null) {
                session.close();
            }
        } catch (HibernateException | NullPointerException hibex) {
        }
    }
    return "";
}
到目前为止,这对我来说似乎还不错。ID是正确的。我决定打开sql输出并获得以下行 (M_ID-->目录的ID) D_ID-->记录的ID ):

通过在SQLServerManagementStudio中使用查询,我获得了按预期列出的记录数量

到目前为止,我一直试图删除出现的单个记录,但行为保持不变

我已经做了一些研究,但还不太成功:

    • 完全不同的错误
    • 我不认为我们有同样的问题
    • 没有使用任何限制
    • 这篇文章很有趣,但我试着将懒惰改为渴望,重新启动服务器,重建项目。还是一样
以下是我的类(如前所述,我没有使用FetchType.EAGER。这只是出于测试目的)


我的Hibernate核心版本是3.6.10。Final

自己找到了答案:

我们有以下比较指标:

@OneToMany(mappedBy = "myrecordID_FK", fetch = FetchType.EAGER)
@Sort(type = SortType.COMPARATOR, comparator = MyRecordComparator.class)
private SortedSet<MyRecord> myrecord = new TreeSet<>();
在运行一些测试之后,我发现只有当compare方法返回-1或1时,我的记录才能成功加载。如果两个比较值相等且返回值为0,则
SortedSet
会出现问题

所以我把它改成:

公共类MyRecordComparator实现了Comparator{

@Override
public int compare(Object obj1, Object obj2) {
    MyRecord d1 = (MyRecord) obj1;
    MyRecord d2 = (MyRecord) obj2;

    return d1.getPos_nr().compareTo(d2.getPos_nr());
    }

}
@Override
public int compare(Object obj1, Object obj2) {
    MyRecord d1 = (MyRecord) obj1;
    MyRecord d2 = (MyRecord) obj2;

    int c1 = d1.getPos_nr().compareTo(d2.getPos_nr());

    if (c1 == 0) {
        int c2 = d1.getAltval().compareTo(d2.getAltval());

        return (c2 == 0) ? 1 : c2;

    } else {
        return c1;
    }
}

}
@OneToMany(mappedBy = "myrecordID_FK", fetch = FetchType.EAGER)
@Sort(type = SortType.COMPARATOR, comparator = MyRecordComparator.class)
private SortedSet<MyRecord> myrecord = new TreeSet<>();
@Override
public int compare(Object obj1, Object obj2) {
    MyRecord d1 = (MyRecord) obj1;
    MyRecord d2 = (MyRecord) obj2;

    return d1.getPos_nr().compareTo(d2.getPos_nr());
    }

}
@Override
public int compare(Object obj1, Object obj2) {
    MyRecord d1 = (MyRecord) obj1;
    MyRecord d2 = (MyRecord) obj2;

    int c1 = d1.getPos_nr().compareTo(d2.getPos_nr());

    if (c1 == 0) {
        int c2 = d1.getAltval().compareTo(d2.getAltval());

        return (c2 == 0) ? 1 : c2;

    } else {
        return c1;
    }
}

}