一.主键生成策略
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时,会修改一级缓存中的值,但是不会修改快照区中的值,当提交事务的时候,会比较一级缓存和快照区中的值,
如果相同则不执行更新操作,如果不同,则把一级缓存中的数据更新到数据库。