SSH-Hibernate(2)

一.主键生成策略

1.Hibernate要求实体类中有一个唯一属性,对应表中的主键。

主要的为两个值:

(1)native:根据数据库底层生成表示符;

(2)uuid:生成UUID类型的值,实体类中主键为字符串类型。

二.修改操作

package com.lgh.utils;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;


/**
 * Created by LGH on 2018/3/9.
 */
public class HibernateUtils {
    private static final Configuration cfg;
    private static final SessionFactory sessionFactory;
    static {
        cfg=new Configuration().configure();
        sessionFactory=cfg.buildSessionFactory();
    }
    public static Session getSession(){
        return sessionFactory.openSession();
    }
}

更新操作:

package com.lgh.test;

import com.lgh.entity.User;
import com.lgh.utils.HibernateUtils;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

/**
 * Created by LGH on 2018/3/8.
 */
public class HibernateTest {
    @Test
    public void update(){
        Session session = HibernateUtils.getSession();
        Transaction transaction = session.beginTransaction();
        //先查询再修改
        User user = session.get(User.class, "1");
        user.setUserName("关羽");
        session.update(user);
        transaction.commit();
        session.close();
    }
}

注:在开发中通常是表单传到服务器的修改对象,如果对象中有主键则可以直接进行更新操作,无需再从数据库查询,再修改。

三.根据id查询

package com.lgh.test;

import com.lgh.entity.User;
import com.lgh.utils.HibernateUtils;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

/**
 * Created by LGH on 2018/3/8.
 */
public class HibernateTest {
    @Test
    public void get(){
        Session session = HibernateUtils.getSession();
        Transaction transaction = session.beginTransaction();
        User user = session.get(User.class, "1");
        transaction.commit();
        session.close();
    }
}

四.删除操作

package com.lgh.test;

import com.lgh.entity.User;
import com.lgh.utils.HibernateUtils;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

/**
 * Created by LGH on 2018/3/8.
 */
public class HibernateTest {
    @Test
    public void update(){
        Session session = HibernateUtils.getSession();
        Transaction transaction = session.beginTransaction();
        //先查询再修改
        User user = session.get(User.class, "1");
        session.delete(user);
        transaction.commit();
        session.close();
    }
}

五.实体类的三种状态:

(1)瞬时态:对象中无id,与session无关联(创建对象)

User user = new User();
user.setUserName("李");
user.setPassword("12345");

(2)持久态:对象中有id,与session有关

User user = session.get(User.class, "1");

(3)托管态:对象中有id,与session无关联

User user=new User();
user.setUid(1);

saveOrUpdate()方法:既可以执行添加操作,也可以执行更新操作,但是根据对象状态而定。

//持久态
        User user = session.get(User.class, "1");
        user.setUserName("张飞");
        session.saveOrUpdate(user);

执行的sql语句:


//瞬时态
        User user = new User();
        user.setUserName("谢");
        session.saveOrUpdate(user);

执行sql语句:


//托管态
        User user = new User();
        user.setId("1");
        user.setUserName("关羽");
        session.saveOrUpdate(user);

执行sql语句:


由以上三种状态执行的sql语句可以看到,每种状态下saveOrUpdate()的执行,瞬时状态执行添加操作,托管态和持久态

都是执行修改操作。

六.Hibernate的一级缓存

缓存:把数据存到内存,以提高读取效率。

Hibernate缓存分类:一级缓存;二级缓存。

缓存特点:

一级缓存:

(1)Hibernate一级缓存默认是打开的;

(2)Hibernate一级缓存的作用范围是session从创建到关闭的作用范围;

(3)Hibernate一级缓存中存储的数据必须是持久态。

二级缓存:

(1)目前已经不使用了,替代技术redis;

(2)二级缓存默认不是打开的,需要配置;

(3)二级缓存的作用范围就是SessionFactory的作用范围。

七.一级缓存的执行

在执行查询时,Hibernate首先从一级缓存中取数据,如果一级缓存中有数据则直接取出,如果一级缓存中没有数据才会从

数据库中取数据,并存储于一级缓存中;

User user = session.get(User.class, "1");
user.setUserName("张飞");

在执行上面这段代码时,首先会从数据库查询数据并存于一级缓存中,并存一份到一级缓存对应的快照区中,当执行setUserName时,会修改一级缓存中的值,但是不会修改快照区中的值,当提交事务的时候,会比较一级缓存和快照区中的值,

如果相同则不执行更新操作,如果不同,则把一级缓存中的数据更新到数据库。












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值