Hibernate的加载策略

xiaoxiao2025-06-01  45

一: 对象的三种状态(hibernate管理的对象)

 1 临时状态  2 持久状态  3 游离状态

 

 

注: 1:hibernate是通过管理对象来操作数据库的,这里的对象是数据对象

      2:hibernate的三种状态是可以相互转化的

 

二:立即加载

1:立即加载 2: 延迟加载       代理对象         存单         LazyInitializationException                  单例模式             饱汉模式             饿汉模式/懒汉模式

遇到的报错:不能初始化代理对象

      通过get 和load 来讲解

          1:hibernate3以上,所有的关联查询都是使用懒加载的策略

什么是懒加载策略:

在session会话的数据库操作方式时,并不会直接生产sql语句去操作数据,而是先创建一个代理对象,将oid(Object id)存放在session的代理对象中,当具体需要用到的持久化对象的时候才会生成sql语句进行查询。

 

四: 并发控制    version

   update t_student set sname='zs1', version=version+1      where sid = 8 and version=0

注意:version在映射实体类中属性必须放在《property》属性之前

 

案列

dao层

package com.zking.three.dao; import org.hibernate.Session; import org.hibernate.Transaction; import com.zking.one.entity.User; import com.zking.two.entity.Student; import com.zking.two.util.SessionFactoryUtil; public class UserDao { //立即加载 public User getUser(User user) { Session session = SessionFactoryUtil.getSession(); Transaction transaction = session.beginTransaction(); System.out.println(123); User u = session.get(User.class, user.getId()); System.out.println(456); System.out.println(u.getUserName()); transaction.commit(); session.close(); return u; } /** * 不能初始化代理对象 * 懒加载 出现could not initialize proxy [com.zking.one.entity.User#4] - no Session报错 * * @param user * @return */ // public User loadUser(User user) { Session session = SessionFactoryUtil.getSession(); Transaction transaction = session.beginTransaction(); System.out.println(123); User u = session.load(User.class, user.getId()); System.out.println(456); System.out.println(u.getUserName()); transaction.commit(); session.close(); return u; } public void updateStudent(Student student) { Session session = SessionFactoryUtil.getSession(); Transaction transaction = session.beginTransaction(); session.update(student); transaction.commit(); session.close(); } }

dao层的junit

package com.zking.three.dao; import static org.junit.Assert.*; import org.junit.Before; import org.junit.Test; import com.zking.one.entity.User; import com.zking.two.entity.Student; public class UserDaoTest { private UserDao userDao=new UserDao(); @Test public void testGetUser() { User user=new User(); user.setId(4); User u=this.userDao.getUser(user); System.out.println(u.getId()); System.out.println(u.getUserName()); } /** * 不能初始化代理对象 * could not initialize proxy [com.zking.one.entity.User#4] - no Session * 通过get,load两个方法讲解 * 1.hibernate3以上,所有的关联查询都是使用懒加载的策略 * 什么是懒加载的策略? * 在调用session会话的数据库操作方式时,并不会直接生成sql语句去操作数据库, * 而是先创建一个代理对象 将oid(Object id)存放在session的代理对象中, * 当具体要用到的持久化对象的时候才会生成sql语句进行查询。 */ @Test public void testLoadUser() { User user=new User(); user.setId(4); User u=this.userDao.loadUser(user); System.out.println(u.getId()); System.out.println(u.getUserName()); } @Test public void testUpdateStudent() { Student student=new Student(); student.setSid(3); student.setSname("琳2"); student.setVersion(1); this.userDao.updateStudent(student); } }

 

实体类的映射类

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <!-- table:实体类对应的表明 name:实体类的全类名 --> <class name="com.zking.two.entity.Student" table="t_hibernate_student"> <id name="sid" type="java.lang.Integer" column="sid"> <!-- 程序员自己控制(必须指定主键的值) --> <!-- <generator class="assigned" /> --> <!-- 数据库控制 --> <!-- mysql数据库 <generator class="identity" /> --> <!-- <generator class="sequence" > orcal数据库 可以指定序列 <param name="sequence_name">xxxs</param> </generator> --> <!-- 实现跨数据库主键生成策略 只需要改主配置文件的方言即可(这种设计值运用于数字类型的)--> <!-- <generator class="native"> </generator> --> <!-- 交给hibernate来控制主键生成 --> <generator class="increment"> </generator> </id> <version name="version" type="java.lang.Integer" column="version"></version> <property name="sname" type="java.lang.String" column="sname"> </property> </class> </hibernate-mapping>

 

转载请注明原文地址: https://www.6miu.com/read-5031074.html

最新回复(0)