一、hibernate的持久化类
1、什么是持久化类:
持久化:将数据存储到关系型数据库。
持久化类:与数据库中的数据表建立了某种关系的java类。(持久化类=javabean+映射配置文件)
2、持久化类的编写规则:
(1)需要提供无参的构造方法。因为在Hibernate底层需要使用反射生成类的实例。
(2)持久化类的属性需要私有,对私有的属性提供公有的get和set方法。
(3)持久化类的属性要尽量使用包装类的类型。包装类的类型予以描述更清晰而基本数据类型不容易描述。
(4)持久化类要有一个唯一标识OID与表的主键对应。(用来区分不同的对象)
(5)持久化类尽量不要使用final修饰。
二、hibernate的主键生成策略(记录录入时主键的生成规则)
1、主键可以区分不同的实体,主键可以分为自然主键和代理主键:
(1)自然主键:是一个实体的其中一条属性,比如:学生的学号,是一个字段同时也是一个主键。
(2)代理主键:就是充当主键的字段不是实体的一个属性,但是它具有主键的功能,可以标识一个实体。例如:设置ID。
2、主键生成策略:
(1)native(hibernate默认):根据所使用的数据库支持能力从identity、sequence等生成策略中选择一种
<id name="studentno" column="studentno">
<generator class="native"></generator>
</id>
public static void testSel() {
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
Student student=new Student();
student.setSname("zzzz");
student.setSex("男");
student.setBirthday("2019-11-11");
student.setClassno("201911");
student.setPoint(111);
student.setPhone("1873496511");
student.setEmail("20171514@qq.com");
session.save(student);
transaction.commit();
session.close();
}
主键自增,不需要设置主键的值,主键必须为数字。
(2)increment:
<id name="studentno" column="studentno">
<generator class="increment"></generator>
</id>
public static void testSel() {
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
Student student=new Student();
student.setSname("zzzz");
student.setSex("男");
student.setBirthday("2019-11-11");
student.setClassno("201911");
student.setPoint(111);
student.setPhone("1873496511");
student.setEmail("20171514@qq.com");
session.save(student);
transaction.commit();
session.close();
}
由hibernate维护,主键自增,每次插入的时候,都会查询当前主键的最大值,加一后作为新的主键值。
存在线程安全问题,只有在没有其他线程的时候才能使用。(一般不用)
(3)sequence:Oracle的主键生成策略。
(4)native(根据底层数据库能力不同来选择identity、sequence、hilo三种生成器中的一种),项目中如果有多种数据库的时候可以使用此方式
(5)uuid(主键的数据类型必须为String,随机生成一个不会重复的字符串):
<id name="studentno" column="studentno">
<generator class="uuid"></generator>
</id>
public static void testSel() {
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
Student student=new Student();
student.setSname("zzzz");
student.setSex("男");
student.setBirthday("2019-11-11");
student.setClassno("201911");
student.setPoint(111);
student.setPhone("1873496511");
student.setEmail("20171514@qq.com");
session.save(student);
transaction.commit();
session.close();
}
前面的几种都是代理主键生成策略,下面一种为自然主键生成策略。
(6)assigned(为自然主键生成策略,需要指定主键的值,不会自动生成):
<id name="studentno" column="studentno">
<generator class="assigned"></generator>
</id>
public static void testSel() {
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
Student student=new Student();
student.setStudentno(2000000);
student.setSname("zzzz");
student.setSex("男");
student.setBirthday("2019-11-11");
student.setClassno("201911");
student.setPoint(111);
student.setPhone("1873496511");
student.setEmail("20171514@qq.com");
session.save(student);
transaction.commit();
session.close();
}
(7)identity:主键由数据库自动生成
三、hibernate持久化的三种状态
1、三种状态:
public static void testSel() {
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
Student student=new Student();//瞬时态
student.setSname("zzzz");//瞬时态
student.setSex("男");//瞬时态
student.setBirthday("2019-11-11");//瞬时态
student.setClassno("201911");//瞬时态
student.setPoint(111);//瞬时态
student.setPhone("1873496511");//瞬时态
student.setEmail("20171514@qq.com");//瞬时态
session.save(student);//持久化状态
transaction.commit();
session.close();//游离状态
}
(1)瞬时态(临时态、自由态)(没有id没有与session关联)
创建出了一个Student对象,此对象和Hibernate没有任何关系。
(2)持久化态(有id,与session有关联),在事务没有提交之前变为持久态
执行了session.save(student);后生成了id值,但是并未执行insert语句
(3)游离(托管)态:有id,没有与session关联(曾经被session管理过)
2、持久化状态的特点:
持久化对象的任何变化都会自动同步到数据库。