一、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("");
student.setPoint();
student.setPhone("");
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、持久化状态的特点:

持久化对象的任何变化都会自动同步到数据库。

最新文章

  1. 学习UFT11.5历程(一)
  2. Android限定EditText的输入类型为数字或者英文(包括大小写),EditText,TextView只能输入两位小数
  3. [C#]集合已修改;可能无法执行枚举操作
  4. Jquery.Datatables td宽度太长的情况下,自动换行
  5. hdu 1097 A hard puzzle
  6. SQLSERVER监控复制并使用数据库邮件功能发告警邮件
  7. php: zend server 安装及相关配置
  8. jquery.idTabs使用方法
  9. LED的压降
  10. redis.config翻译
  11. UVALive 2035 The Monocycle(BFS状态处理+优先队列)
  12. Pandas.Series.dt.dayofweek相关命令
  13. Daubechies小波介绍
  14. FIN omitted, FIN-ACK sent
  15. 乘风破浪:LeetCode真题_031_Next Permutation
  16. SpringCloud微服务部署
  17. 客户端Git代码的下载与提交
  18. PHP获取用户的真实IP地址
  19. POJ 1142 Smith Numbers(分治法+质因数分解)
  20. 哈代平衡 &amp;连锁不平衡

热门文章

  1. RabbitMQ之消息模式(下)
  2. Jenkins版本迭代以及回滚
  3. 【leetcode-11】盛最多水的容器
  4. Python 基础-import 与 from...import....
  5. 构建helm chart应用
  6. MVC运行机制[转]
  7. 解读HTTP/3
  8. JavaScript原型链以及Object,Function之间的关系
  9. SAP错误消息调试之七种武器:让所有的错误消息都能被定位
  10. [I2C].I2C总线详解