关于hibernate的fetch以及懒加载

    关于hql语句首先,是基于对象的sql语言,from后面的是类名 ,而不是表名,如果说你写的是表名,那么就会报一个没有映射的异常,开始我找了半天,后来实在不行百度的,确实 这个很容易忽略,

以下是例子hql语句

String hql="select distinct c from Customer c left outer join fetch c.orders where c.id=?";


关于fetch和lazy

fetch有两个可选项,一个是select  另一个是join

当fetch=“select” 时, 那么查询连接本对象的其他对象,就会多发送一条sql语句

当fetch=“join” 时,那么查询连接本对象的其他对象,也就是其他对象初始化,直接一条语句就查询出来,用的是左外连接,如果说想用fetch来控制hql语句 需要添加  left outer join fetch 

public void testFetch(){
		Customer customer = (Customer) session.get(Customer.class,1);
		System.out.println(customer);
		System.out.println("--------------------------------------");
		System.out.println(customer.getOrders().size());
	}
	

	
@Test
public void testHQLFetch(){
		String hql="select distinct c from Customer c left outer join fetch c.orders "
				+"where c.id=?";
		
		Customer customer=(Customer)session.createQuery(hql)
											.setParameter(0, 2)
											.uniqueResult();
		System.out.println(customer.getLastName());
		System.out.println(customer.getOrders());
		
	}	

但是fetch这个属性只对 get语句有用,对hql语句不起作用。

lazy是懒加载    当lazy=“true” 时,那么就是懒加载,懒加载就是,当用到关联的对象的时候,才发送sql语句,如果没 用,那么就不发sql语句

懒加载有一个异常是 session.close()之后 ,在调用lazy  那么就会报异常,很常见



以下是测试语句

	private SessionFactory sessionFactory=null;
	private Session session=null;
	private Transaction tx=null;
	
	@Before
	public void init(){
		//1.创建sessionFactory对象
		Configuration configuration = new Configuration().configure();
		ServiceRegistry serviceRegistry = 
				new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
		sessionFactory = configuration.buildSessionFactory(serviceRegistry);
		//2.获取session
		session = sessionFactory.openSession();
		//3.获取事务
		tx = session.beginTransaction();
	}
	
	@After
	public void destory(){
		//4.提交事务
		tx.commit();
		//5.关闭session
		session.close();
		//6.关闭sessionFactory
		sessionFactory.close();
	}


你可能感兴趣的:(关于hibernate的fetch以及懒加载)