昨天在学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)背景和相关配置如下:
商品表的映射文件中的关联配置:
订单表中的:
出问题的语句是在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 = new HashSet();
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,这样就不需要二次查询,但是依然有这个错误。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
问题已经解决,是数据库和映射文件没有对上,数据库中的表orders的ID字段多了一个空格。