SQLGrammarException: could not initialize a collection


昨天在学Hibernate的多对多关联映射,遇到一个错误:org.hibernate.exception.SQLGrammarException: could not initialize a collection: [com.duqi.ORM.Items.orders#8]

(1)参考网上类似的说法:
http://blog.csdn.net/derpvailzhangfan/article/details/1644287 ;但是他这个是SQL Server的。
(2)背景和相关配置如下:
商品表的映射文件中的关联配置:


 <!-- 通过table项高数hibernate中间表的名称,name表示在Item类中有一个变量存放orders集合-->
<set name="orders" table="selecteditems" cascade="save-update" inverse="true" lazy="false">
    <!-- 通过key属性告诉hibernate在中间表里查询ITEMID的相应item记录(1条) -->
    <key column="ITEMID"/>
    <!-- 通过column项告诉hibernate在Orders表中查询ORDERID值相应的所有ORDER记录(多条) -->
    <many-to-many class="com.duqi.ORM.Orders" column="ORDERID"/>
</set>

订单表中的:


 <!-- 映射Orders到Items的多对多关联 -->
    <set name="items" table="selecteditems" cascade="save-update" lazy="false">
        <!-- key属性告诉hibernate在中间表中查找ORDERID值对应的order记录(1条) -->
        <key column="ORDERID"/>
        <!-- 通过column属性告诉hibernate在Items表中查找ITEMID对应的item记录(多条),
        因为跟ORDERID对应的ITEMID可能不止一条 -->
        <many-to-many class="com.duqi.ORM.Items" column="ITEMID"/>
    </set>

出问题的语句是在DAO类中:


 public Items loadItems(Integer id){
    session = HibernateSessionFactory.getSession();
    Items item = null;
    try {
        transaction = session.beginTransaction();
        item = (Items) session.get(Items.class, id);
                    //这条语句的意图是使得item.getOrders()返回的对象可以脱离Session使用,这个理解没问题吧?
        Hibernate.initialize(item.getOrders()); //这条语句出错
        transaction.commit();
    } catch (Exception e) {
        // TODO: handle exception
        transaction.rollback();
        System.out.println("loadItems异常");
        e.printStackTrace();
    } finally{
        session.close();
    }
    return item;
}

我的测试函数是:


 public static void main(String[] args) {
    ManyManyDAO dao = new ManyManyDAO();
    Items item = new Items();
    item.setItemname("商品测试");
    item.setItemno("007");
    dao.addItems(item);
    Items item2 = new Items();
    item2.setItemname("商品测试2");
    item2.setItemno("008");
    dao.addItems(item2);
    Items item3 = new Items();
    item3.setItemname("商品测试3");
    item3.setItemno("009");
    dao.addItems(item3);    
    Set<Items> items = new HashSet<Items>();
    items.add(dao.loadItems(new Integer(8)));
    items.add(dao.loadItems(new Integer(9)));
    Orders order = new Orders();
    order.setItems(items);
    order.setMoney(100.8);
    order.setOrderno("A0009");
}

另外,我的数据库设计如下:
(1)items表
图片描述
(2)orders表
图片描述
(3)关联表selecteditems
图片描述

我的尝试:已经试过将映射文件里的lazy属性改成false,这样就不需要二次查询,但是依然有这个错误。

hibernate java mysql

午夜吟唱者 11 years, 1 month ago

问题已经解决,是数据库和映射文件没有对上,数据库中的表orders的ID字段多了一个空格。

琐琐碎碎2 answered 11 years, 1 month ago

Your Answer