java - SQLGrammarException: could not initialize a collection
巴扎黑
巴扎黑 2017-04-17 13:10:45
[Java讨论组]

昨天在学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,这样就不需要二次查询,但是依然有这个错误。

巴扎黑
巴扎黑

全部回复(1)
迷茫

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号