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

回答:

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

以上是 SQLGrammarException: could not initialize a collection 的全部内容, 来源链接: utcz.com/p/179047.html

回到顶部