Hibernate异常之Exception in thread "main" org.hibernate.HibernateException: createQuery is not valid...

这篇博客主要介绍了在使用Hibernate 3.6.10.Final版本时遇到的'Exception in thread "main" org.hibernate.HibernateException: createQuery is not valid without active transaction'异常。异常源于在执行查询操作时没有激活的事务。为解决此问题,文章提供了示例代码,强调在Hibernate查询中必须包含事务管理。作者欢迎大家交流其他可能的解决方案。

1、异常描述

Exception in thread "main" org.hibernate.HibernateException: createQuery is not valid without active transaction

备注:

      此处hibernate版本号3.6.10.Final

2、示例代码

以下是部分示例代码:

public class ClazzDao {
	
	public List<Clazz> findAll(){
		// 1、创建配置对象     查找hibernate.cfg.xml文件
		Configuration configure = new Configuration().configure();
		// 2、创建session工厂
		SessionFactory sessionFactory = configure.buildSessionFactory();
		// 3、创建session
		Session session = sessionFactory.getCurrentSession();
		// 4、创建Query对象(hql语句)
		Query query = session.createQuery("from Clazz");
		// 5、执行查询
		List list = query.list();
		return list;
	}
	
}

/*   测试代码   */
public class TestClazzDao {
	ClazzDao clazzDao = new ClazzDao();
	@Test // 测试查询
	public void test1(){
		List<Clazz> list = clazzDao.findAll()
对于 `org.hibernate.HibernateException: collection is not associated with any session` 错误,虽然给定引用中未直接提及解决该错误的方案,但可以从Hibernate的常见处理思路来分析可能的解决方法。 一种可能的解决思路是确保集合在使用时关联到一个有效的Hibernate会话。可以考虑使用急切加载(Eager Loading)来避免在会话关闭后访问集合。如引用[3]中展示的使用 `@ManyToMany(fetch = FetchType.EAGER)` 注解,这种方式会在查询主实体时同时加载关联的集合,从而避免在会话关闭后尝试访问集合而引发该错误。 以下是一个简单的示例代码,展示如何使用急切加载来处理集合: ```java import javax.persistence.*; import java.util.Set; @Entity public class Client { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @ManyToMany(fetch = FetchType.EAGER) @JoinTable(catalog = "book_project", name = "client_book", joinColumns = { @JoinColumn(name = "client", referencedColumnName = "name") }, inverseJoinColumns = { @JoinColumn(name = "book", referencedColumnName = "name") }) java.util.Set<Book> books; // Getters and Setters public Long getId() { return id; } public void setId(Long id) { this.id = id; } public Set<Book> getBooks() { return books; } public void setBooks(Set<Book> books) { this.books = books; } } @Entity public class Book { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; // Getters and Setters public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } ``` 此外,还需要确保在事务的环境下执行操作,因为Hibernate的会话通常与事务紧密相关。如果操作不在事务中,可能会导致会话提前关闭,从而使集合失去与会话的关联。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值