Hibernate缓存机制,一级缓存,表中数据一对多
标签: JAVA框架
缓存:
1、一级缓存
为session级别的缓存,一级缓存的生命周期和session的生命周期一致(opensession开始 close结束)
get()方法
可以把对象放入缓存中,也可以从缓存中把对象提取出来
save()方法
可以把一个对象放入缓冲区
update()方法
可以把一个对象放到缓冲区一份
evict(参数 缓冲区对象)方法
可以把一个对象从session的缓存中清空
clear()方法
清空一级还困中所有的数据
close()方法
当调用session.close方法的时候,一级缓存的生命周期就结束了
学习过程
1、创建工程Day-One-Many
2、在lib文件夹下导入jar包
3、在src目录下创建hibernate.cfg.xml文件
4、配置文件头
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
5、配置数据库连接的基本信息
<hibernate-configuration>
<session-factory>
<property name="connection.username">root</property>
<property name="connection.password">123456</property>
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="connection.url">
jdbc:mysql://localhost:3306/jdbc01
</property>
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<!-- update每次hibernate启动的时候,检查表是否存在,如果不存在,创建,如果存在,则什么都不做 -->
<property name="hbm2ddl.auto">update</property>
</session-factory>
</hibernate-configuration>
6、创建持久化类
package com.cd.domain;
public class Person {
private int pid;
private String pname;
private String description;
public int getPid() {
return pid;
}
public void setPid(int pid) {
this.pid = pid;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String toString() {
return "Person [pid=" + pid + ", name=" + pname + ", description=" + description + "]";
}
}
7、创建持久化类的对应对象:在与持久化类相同的一个包下创建Person.hbm.xml文件
1>导入头文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
2>根据持久化类对Person.hbm.xml进行配置
<!--name代表持久化类中的属性名字
colunm代表在数据库表中属性的名字,可以不写,不写默认与name相同
length代表长度
generator 代表主键产生器
java.lang.String代表默认属性的最大长度
-->
<hibernate-mapping>
<class name="com.cd.domain.Person" table="person">
<id name="pid" column="id" length="10">
<generator class="increment"></generator>
</id>
<property name="name" length="20" type="java.lang.String"></property>
<property name="description" length="50" type="java.lang.String"></property>
</class>
</hibernate-mapping>
8、创建表:在com.cd.db中创建CreateTable.java
package com.cd.db;
import org.hibernate.cfg.Configuration;
/*
* 创建表的操作
*/
public class CreateTable {
public static void main(String[] args){
Configuration con = new Configuration();
con.configure();
con.buildSessionFactory();
}
}
9、创建数据库连接文件:com.cd.util HibernateUtil.java
package com.cd.util;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
/*
* 返回一个打开的sessionFactory 数据库连接
*/
public class HibernateUtil {
public static Session getSession(){
Configuration configuration=new Configuration();
configuration.configure();
SessionFactory sessionFactory=configuration.buildSessionFactory();
return sessionFactory.openSession();
}
}
10、创建持久化类操作类进行操作:com.cd.dao PersonDao.java
package com.cd.dao;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.cd.domain.Person;
import com.cd.util.HibernateUtil;
public class PersonDao {
public static void main(String[] args) {
// TODO Auto-generated method stub
getById();
}
private static void getById() {
// TODO Auto-generated method stub
Session session=HibernateUtil.getSession();
Person p=(Person) session.get(Person.class, 1);
Person p2=(Person) session.get(Person.class, 2);
Person p3=(Person) session.get(Person.class, 2);
System.out.println(session.getStatistics().getEntityCount());
System.out.println(p);
System.out.println(p2);
System.out.println(p3);
/*
为session级别的缓存,一级缓存的生命周期和session的生命周期一致(opensession开始 close结束)
get()方法
可以把对象放入缓存中,也可以从缓存中把对象提取出来
save()方法
可以把一个对象放入缓冲区
update()方法
可以把一个对象放到缓冲区一份
evict(参数 缓冲区对象)方法
可以把一个对象从session的缓存中清空
clear()方法
清空一级还困中所有的数据
close()方法
当调用session.close方法的时候,一级缓存的生命周期就结束了
*/
session.clear();
System.out.println(session.getStatistics().getEntityCount());
session.close();
}
}
11、在hiberna.cfg.xml中添加配置
<session-factory>
<mapping resource="com/cd/domain/Person.hbm.xml"/>
</session-factory>
表中数据一对多的学习过程
1、创建两个持久化类 学生和班级Student.java 和 Classes.java
1>Student.java
package com.cd.domain;
import java.io.Serializable;
public class Student implements Serializable{
private int sid;
private String sname;
private String sdescription;
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getSdescription() {
return sdescription;
}
public void setSdescription(String sdescription) {
this.sdescription = sdescription;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "sid+"+sid+"sname+"+sname+"sdescription+"+sdescription;
}
}
2>Classes.java
package com.cd.domain;
import java.io.Serializable;
import java.util.Set;
public class Classes implements Serializable{
private int cid;
private String cname;
private String cdescription;
private Set<Student> students;
public int getCid() {
return cid;
}
public void setCid(int cid) {
this.cid = cid;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
public String getCdescription() {
return cdescription;
}
public void setCdescription(String cdescription) {
this.cdescription = cdescription;
}
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "cid+"+cid+"cname+"+cname+"cdescription+"+cdescription+"students+"+students;
}
}
2、创建持久化类对应的映射:Student.hbm.xml和Classes.hbm.xml
1>Student.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.cd.domain.Student" table="student">
<id name="sid">
<generator class="increment"></generator>
</id>
<property name="sname" length="20"></property>
<property name="sdescription" length="50"></property>
</class>
</hibernate-mapping>
2>Classes.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.cd.domain.Classes" table="classes">
<id name="cid">
<generator class="increment"></generator>
</id>
<property name="cname" length="20"></property>
<property name="cdescription" length="50"></property>
<!--
set 元素 针对的是Classes类中的Set属性
cascade 级联操作
null 默认值
save-update 在保存Classes对象的时候,针对student进行保存或者更新操作
在更新Classes对象的时候,针对student进行保存或者更新操作
all
delete
inverse 关系操作
默认false :classes维护classes和student之间的关系
true :classes不维护classes和student之间的关系
-->
<set name="students" cascade="all" inverse="false">
<!-- 外键
告诉hibernate,通过cid就可以建立classes和student之间的关系
-->
<key>
<column name="cid"></column>
</key>
<!-- 告诉 hibernate,Classes类中的set集合存放的是哪个元素-->
<one-to-many class="com.cd.domain.Student" />
</set>
</class>
</hibernate-mapping>
3、创建一个操作类:OnetoMoneyText.java
package com.cd.dao;
import java.util.HashSet;
import java.util.Set;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.cd.domain.Classes;
import com.cd.domain.Student;
import com.cd.util.HibernateUtil;
/*
* 一对多
* 一般操作
* 1 保存班级
* 2 保存学生
* 3 保存班级 学生
* 级联操作
* 4 保存班级级联保存学生
*/
public class OneToManyText {
public static void main(String[] args){
//saveClasses();
//saveStudent();
//saveCS();
saveC_S();
}
private static void saveC_S() {
// TODO Auto-generated method stub
Session session=HibernateUtil.getSession();
Transaction transaction=session.beginTransaction();
Classes classes=new Classes();
classes.setCname("班级5");
classes.setCdescription("平行2班");
Student student=new Student();
student.setSname("学生5");
student.setSdescription("学生5描述");
Student student2=new Student();
student2.setSname("学生6");
student2.setSdescription("学生6描述");
Set<Student> students=new HashSet<Student>();
students.add(student);
students.add(student2);
classes.setStudents(students);
session.save(classes);
transaction.commit();
session.close();
}
private static void saveCS() {
// TODO Auto-generated method stub
Session session = HibernateUtil.getSession();
Transaction transaction = session.beginTransaction();
Classes classes=new Classes();
classes.setCname("班级4");
classes.setCdescription("平行班1");
Student student = new Student();
student.setSname("学生4");
student.setSdescription("学生4描述");
session.save(classes);
session.save(student);
transaction.commit();
session.close();
}
private static void saveStudent() {
// TODO Auto-generated method stub
Session session=HibernateUtil.getSession();
Transaction transaction=session.beginTransaction();
Student student=new Student();
student.setSname("学生3");
student.setSdescription("学生3描述");
session.save(student);
transaction.commit();
session.close();
}
private static void saveClasses() {
// TODO Auto-generated method stub
Session session =HibernateUtil.getSession();
Transaction transaction=session.beginTransaction();
Classes classes=new Classes();
classes.setCname("初中部3班");
classes.setCdescription("火箭3班");
session.save(classes);
transaction.commit();
session.close();
}
}
作业:一对多练习
商品分类 商品 1个分类下多个商品
1、添加分类
2 添加商品
3 添加分类,并且给该分类下添加10条商品
4 把分类id为1的分类下所有的商品库存改为0,描述改为该类商品暂不销售
5 给分类id为2的分类 追加10条商品
6 把商品1 从分类1中挪到分类2中
7 删除分类1,并删除该分类下的所有商品