实体类编写规范:

- 每个属性不应该被公开的访问,设置私有

- 提供可以访问和设置的方法,GETTER & SETTER

- 必须编写一个主键属性【ID 唯一值】

- 建议使用基本类型的包装类,因为基本类型不可以表示NULL


主键生成策略:

- HIbernate 要求实体类里面有一个属性作为唯一的值,对应表主键,主键可以不填

<generator class="native" /> <!-- 主键自增策略 -->

- 策略值项:

  1、increment 

    支持long、int、short类型,自增方式的唯一标识,步长1,

    无其他进程插入SQL可使用,不支持多线程操作【脏数据危险】

  2、identity 

    采用数据库底层提供的主键生成标识符,

    必须是数据库支持的数据类型

  3、sequence 

    根据底层数据库序列生成标识符,

    条件是数据库支持序列

  4、native 

    底层数据库对自动生成标识符的能力来选择【2、3、Hilo】其中的一种,

    可跨数据库平台开发

    【生成:主键、非空、自增、int类型】

  5、uuid 

    128位的UUID算法生成标识符,

    绝对唯一标识,占用空间太多

    【生成:主键、非空、VARCHAR类型】

    Java数据类型要使用Java.lang.String

  6、assigned

    由Java程序生成标识符,

    如果没有指定generator元素,默认使用此策略【自然主键】


按ID查询:

    @Test
public void query01(){
Session session = HibernateUtil.getSession(); // 实体类的字节对象,ID值
User user = session.get(User.class, 4);
System.out.println(user);
session.close();
}

修改操作:

先查询,再修改

从思路上是正确的,实际上不需要查询的步骤,

只需要new 一个对象,输入新的字段值和要修改的原始ID

调用UPDATE方法就行了。

另外SAVE也可以用来修改,但是这违背了使用规范,不要这么使用就对了

    @Test
public void query02(){
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); // 实体类的字节对象,ID值
User user = session.get(User.class, 4);
System.out.println(user); // 修改字段
user.setUser_name("用户1004"); // 更新操作
session.update(user); transaction.commit();
session.close();
sessionFactory.close();
}

注意:

只修改部分字段,建议使用查询,再改值,在调用修改,因为可以保证其他不变的字段不改动

另外频繁这么修改,性能效率很低,本质上UPDATE是对这个记录完全覆写,

如果数据表一个字段数特别的多,调用修改性能效率真的很低

删除操作:

先查找,后删除

    @Test
public void query03(){
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); // 实体类的字节对象,ID值
User user = session.get(User.class, 4);
System.out.println(user); // 删除操作
session.delete(user); transaction.commit();
session.close();
sessionFactory.close();
}

也可以是直接获取ID然后封装给实体类对象

再注入给删除操作

        User user = new User();
user.setUser_id(1); // 删除操作
session.delete(user);

实体类对象的状态

- 瞬时状态 

  对象没有ID值,对象和Session没有关联

- 持久状态

  通过Session获取的,对象和Session具有关联关系

- 托管状态

  对象有ID值,对象和Session没有关系


SaveOrUpdate方法

根据实体类实例的状态来调用不同的操作

- 注入瞬时状态的对象,执行的是添加操作

- 注入托管状态的对象,执行的是修改操作

- 注入持久状态的对象,执行的是修改操作


【Hibernate】04 主键策略 & CRUD的更多相关文章

  1. 【hibernate】 hibernate的主键策略

    今天使用maven生成一个sping+springMVC+hibernate 的项目,报错如下: 错误提示呢:不能解释这个id的生成策略[uuid.string].就是uuid.string这个hib ...

  2. hibernate(2) —— 主键策略

    框架提供了三种主键生成方式,一种是由用户自己维护,一种是由hibernate框架维护,另一种是由数据库维护. 自己维护就是在插入数据的时候,一定要指定主键的值,否则会出错,如果由框架维护和由数据库维护 ...

  3. hibernate 注解 主键生成策略

    一.JPA通用策略生成器       通过annotation来映射hibernate实体的,基于annotation的hibernate主键标识为@Id, 其生成规则由@GeneratedValue ...

  4. 大家一起撸代码之——Hibernate各种主键生成策略与配置详解

    1.assigned 主键由外部程序负责生成,在 save() 之前必须指定一个.Hibernate不负责维护主键生成.与Hibernate和底层数据库都无关,可以跨数据库.在存储对象前,必须要使用主 ...

  5. Hibernate中主键生成策略

    主键生成策略 increment identity sequence native uuid assigned 1) increment 由hibernate完成 主键递增, 原理:select ma ...

  6. Hibernate各种主键生成策略与配置详解

    出自:http://www.cnblogs.com/kakafra/archive/2012/09/16/2687569.html 1.assigned 主键由外部程序负责生成,在 save() 之前 ...

  7. Hibernate各种主键生成器策略与配置详解(转载)

    http://www.cnblogs.com/kakafra/archive/2012/09/16/2687569.html 1.assigned 主键由外部程序负责生成,在 save() 之前必须指 ...

  8. Hibernate各种主键生成策略与配置详解《转》

    1.assigned 主键由外部程序负责生成,在 save() 之前必须指定一个.Hibernate不负责维护主键生成.与Hibernate和底层数据库都无关,可以跨数据库.在存储对象前,必须要使用主 ...

  9. Hibernate各种主键生成策略与配置详解【附1--<generator class="foreign">】

    1.assigned 主键由外部程序负责生成,在 save() 之前必须指定一个.Hibernate不负责维护主键生成.与Hibernate和底层数据库都无关,可以跨数据库.在存储对象前,必须要使用主 ...

  10. Hibernate 主键策略

    Hibernate主键生成策略 .自动增长identity 适用于MySQL.DB2.MS SQL Server,采用数据库生成的主键,用于为long.short.int类型生成唯一标识 使用SQL ...

随机推荐

  1. 剑指Offer-52.正则表达式匹配(C++/Java)

    题目: 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整个模式. ...

  2. QMS质量管理系统:打造企业质量控制的新纪元

    在当今竞争激烈的市场环境下,产品质量是决定企业生存与发展的关键因素之一.为了确保从设计到交付的每一步都符合最高标准,一套高效.全面的质量管理系统(Quality Management System, ...

  3. python webdriver.remote远程创建火狐浏览器会话报错,Unable to create new service: GeckoDriverService

    问题: 使用selenium.webdriver.remote,远程指定地址的浏览器,并创建会话对象:创建火狐浏览器会话时,报错,错误信息如下: Message: Unable to create n ...

  4. 安装PHP5.6.20

    安装php的前提是安装了数据库和httpd!!!!!!!! 1 因为yum缺省安装的是PHP5.4,所以先要添加yum库 [root@svnhost ~]# rpm -Uvh https://mirr ...

  5. 算法金 | 决策树、随机森林、bagging、boosting、Adaboost、GBDT、XGBoost 算法大全

    大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 决策树是一种简单直观的机器学习算法,它广泛应用于分类和回归问题中.它的核心思想是将复杂 ...

  6. 如何查看docker容器的volume挂载情况

    准备在docker容器当中编写个日常维护的脚本,但容器里连yum和vim命令都没有,所以就想到通过容器映射在本机的volume里编写脚本这样在容器中不就可以直接用了吗,那么在这之前你首先得知道dock ...

  7. ubuntu 安装 github desktop

    原文: https://gist.github.com/berkorbay/6feda478a00b0432d13f1fc0a50467f1 sudo wget https://github.com/ ...

  8. OPC 详解 第一篇 基础概念

    一 .概述 OPC 的全称是OPC(OLE for Process Control), 用于过程控制的OLE,OLE(Object Linking and Embedding)大家都知道是对象连接与嵌 ...

  9. Centos 下Rabbit MQ 常用操作指令 汇总

    1.rabbitmq 服务的启动停止. service rabbitmq-server start service rabbitmq-server stop 重启命令需要依次执行 stop 再 sta ...

  10. CF911G 题解

    考虑分块. 如果你做过未来日记就会知道一个很明显的做法--值域并查集. 先考虑整块: 块内没有 \(x\) 则跳过本次操作. 块内有 \(x\) 没有 \(y\) 则令 \(fa[x] = y\) 块 ...