Hibernate缓存机制,一级缓存,表中数据一对多

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,并删除该分类下的所有商品
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值