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,这样就不需要二次查询,但是依然有这个错误。
午夜吟唱者
11 years ago