【问题标题】:Hibernate only loads one object of query-collectionHibernate 只加载一个查询集合对象
【发布时间】:2015-03-13 20:23:34
【问题描述】:

几天前,我在 Hibernate 中遇到了一个奇怪的行为,无法说出为什么突然出现。

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

其实这是很简单的东西,总是用来工作的。 (本文末尾的对象代码)

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

我正在这样获取我的 RC-Object:

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 ):

Hibernate: select myrecord0_.M_ID as M65_9_1_, myrecord0_.D_ID as D1_1_, myrecord0_.D_ID as D1_7_0_ from [MyProj].[dbo].[MyRecord] myrecord0_ where myrecord0_.M_ID=?

通过使用 SQL Server Management Studio 中的查询,我得到了按预期列出的记录数量。

到目前为止,我已尝试删除出现的单个记录,但行为保持不变。

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

这是我的课程(如前所述,我没有使用 FetchType.EAGER。这仅用于测试目的)

@Entity
@Table(name = "[MyProj].[dbo].[Rcatalog]")
public class Rcatalog implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "M_ID")
private Integer RcatalogID_PK;

@ManyToOne()
@JoinColumn(name = "W_ID", insertable = false, updatable = false)
private UpperElement upperelement;

@Column(name = "W_ID")
@JoinColumn(name = "upperelementID_FK", referencedColumnName = "upperelementID_PK")
private Integer upperelementID_FK;

@OneToMany(mappedBy = "myrecordID_FK", fetch = FetchType.EAGER)
@Sort(type = SortType.COMPARATOR, comparator = MyRecordComparator.class)
private SortedSet<MyRecord> myrecord = new TreeSet<>();

//Constructor, Getter, Setter...
}

还有记录:

@Entity
@Table(name = "[MyProj].[dbo].[MyRecord]")
public class MyRecord implements Serializable, PartElementInterface {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "D_ID")
private Integer myrecordID_PK;

@Column(name = "M_ID")
@JoinColumn(name = "myrecordID_FK", referencedColumnName = "myrecordID_PK")
private Integer myrecordID_FK;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "M_ID", insertable = false, updatable = false, nullable = true)
private Rcatalog rcatalog;

//Constructor, Getter, Setter and some more stuff
}

我的 Hibernate-core 版本是 3.6.10.Final

【问题讨论】:

    标签: java sql-server hibernate


    【解决方案1】:

    自己找到了答案:

    我们这里有以下比较器:

    @OneToMany(mappedBy = "myrecordID_FK", fetch = FetchType.EAGER)
    @Sort(type = SortType.COMPARATOR, comparator = MyRecordComparator.class)
    private SortedSet<MyRecord> myrecord = new TreeSet<>();
    

    使用简单的比较算法:

    公共类 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());
        }
    
    }
    

    在运行了一些测试后,我发现我的记录只有在比较方法返回 -1 或 1 时才能成功加载。如果两个比较值相等且返回值为 0,我们会遇到 @987654323 的问题@。

    所以我把它改成了:

    公共类 MyRecordComparator 实现 Comparator{

    @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;
        }
    }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2013-12-02
      • 1970-01-01
      • 1970-01-01
      • 2013-09-19
      • 1970-01-01
      • 2016-09-05
      • 2018-07-22
      • 1970-01-01
      相关资源
      最近更新 更多