hibernate(三)加载策略和并发控制

1. 对象的三种状态(hibernate管理的对象)
1.1 临时状态
1.2 持久状态
1.3 游离状态

在这里插入图片描述

1、hibernate是通过管理对象来操作数据,这里对象指的是持久化对象。
2、hibernate中的三种状态的对象是可以相互转换的,通常编码时只关注持久
化对象。关注get、save、update方法所操作后的对象

加载策略

通过get、load两个方法讲解加载策略:
hibernate3以上,所有的关系查询都是使用懒加载的策略

什么是懒加载的策略?
在调用session会话的数据库操作方式时,并不会直接生成SQL语句去操作数据库。
而是先创建一个代理对象,将oid(object id) 存放在session的代理对象中,
当具体的要用到持久化对象的时候,才会生成SQL语句进行查询。

实体类User:

package com.zking.one.entity;

import java.io.Serializable;

public class User implements Serializable {

	private static final long serialVersionUID = -3363120264501521428L;

	private Integer id;
	private String userName;
	private String userPwd;

	private String realName;
	private String sex;
	private java.sql.Date birthday;

	private java.sql.Timestamp createDatetime;
	private String remark;

	public User() {
		super();
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getUserPwd() {
		return userPwd;
	}

	public void setUserPwd(String userPwd) {
		this.userPwd = userPwd;
	}

	public String getRealName() {
		return realName;
	}

	public void setRealName(String realName) {
		this.realName = realName;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	public java.sql.Date getBirthday() {
		return birthday;
	}

	public void setBirthday(java.sql.Date birthday) {
		this.birthday = birthday;
	}

	public java.sql.Timestamp getCreateDatetime() {
		return createDatetime;
	}

	public void setCreateDatetime(java.sql.Timestamp createDatetime) {
		this.createDatetime = createDatetime;
	}

	public String getRemark() {
		return remark;
	}

	public void setRemark(String remark) {
		this.remark = remark;
	}

//	@Override
//	public String toString() {
//		return "User [id=" + id + ", userName=" + userName + ", userPwd=" + userPwd + ", realName=" + realName
//				+ ", sex=" + sex + ", birthday=" + birthday + ", createDatetime=" + createDatetime + ", remark="
//				+ remark + "]";
//	}

}

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.SessionFactoryUtils;

public class UserDao {

	//讲解立即加载
	public User getUser(User user) {
		Session session = SessionFactoryUtils.getSession();
		Transaction transaction = session.beginTransaction();
		System.out.println(123);
		User u = session.get(User.class, user.getId());
		System.out.println(1456);
		System.out.println(u.getUserName());
		transaction.commit();
		session.close();
		return u;
	}
	
	讲解延迟加载
	public User loadUser(User user) {
		Session session = SessionFactoryUtils.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 = SessionFactoryUtils.getSession();
		Transaction transaction = session.beginTransaction();
		session.update(student);
		transaction.commit();
		session.close();
	}
	
	
}

在Junit测试类中运行如下代码:

1、立即加载

get:

	@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());
	}

在这里插入图片描述

在这里插入图片描述

立即加载,可以看到它是直接查询出来,然后再打印1456

2、延迟加载

load:

	@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());
	}

在这里插入图片描述
在这里插入图片描述

延迟加载,它是在你需要的时候才会去查询,然后在查询出来

并发控制

多个用户在同一时间修改同一个表,所发生的现象

在数据库中增加一个列versionqq(名字可以随便),去完成办法控制
在这里插入图片描述

然后配置并发控制
在这里插入图片描述
注意:version一定要在property前面不然会报错

例如:
根据sid和versionqq把数据库中的名字叫ggg的修改为死神
在这里插入图片描述

@Test
	public void testUpdateStudent() {
		
		//并发控制	 version
		
		Student student = new Student();
		student.setSid(3);//id
		student.setSname("死神");
		student.setVersion(3);
		
		this.UserDao.updateStudent(student);
		
	}

在这里插入图片描述

数据库versionqq发生了改变

在多个用户同时操作一张表的时候每个页面都传了一个versionqq,然后修改表数据的时候,同时修改了versionqq,在一个用户修改成功后,versionqq的值变了,另一个用户再去修改表肯定修改不成功,所以就不会出现办法现象了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值