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的值变了,另一个用户再去修改表肯定修改不成功,所以就不会出现办法现象了