JPA_day2学习

主键生成策略

所谓的主键生成策略,就是Hibernate提供了多种生成主键值的方法

常用的Hibernate的主键生成策略

1)increment
increment策略是指,不使用数据库本地的自增长策略,而实用程序(Hibernate框架)产生自增长的ID值,赋予数据库。
每次插入前都会去查询表中id最大的值,然后+1作为新主键。
2)hilo
高低位算法,主键自增,有hibernate来维护,开发时不使用,应为没有数据库同时不支持主键自增长或者序列号。
3)identity
identity策略,指定使用数据库里面的ID自增长策略,只能用于支持ID自增长功能的数据库,如:MySQL,SQLServer。不支持没有ID自增长策略的数据库,如:Oracke,DB2…
4)sequence
使用序列的实现ID生成策略,主要用于有序列的数据库如:Oracle,DB2,【如果不支持序列的数据库(如:MYSQL),该策略会使用一个表模拟序列。
5)native
使用数据库本地策略,就是数据库里面使用怎么样的策略就用什么策略,Hibernate不做任何的判断,如:MySQL数据库使用了increment_auto,自增长策略.使用native.表示直接调用数据库里面的increment_auto策略。
6)uuid
数据库的的逐渐使用一个唯一的字符串来存储,这个唯一的字符串就是UUID。
逐渐必须为String。
7)assigned
assigned策略,就是不使用主键生成策略,有手工输入ID

JPA实体的四种状态

瞬时状态 transient
瞬时状态的实体就是一个普通的java对象,和持久化上下文无关联,数据库中也没有数据与之对应。
托管状态 persistent
使用EntityManager进行find或者persist操作返回的对象即处于托管状态,此时该对象已经处于持久化上下文中,因此任何对于该实体的更新都会同步到数据库中。
游离状态 detached
当事务提交后,处于托管状态的对象就转变为了游离状态。此时该对象已经不处于持久化上下文中,因此任何对于该对象的修改都不会同步到数据库中。
删除状态 removed
当调用EntityManger对实体进行delete后,该实体对象就处于删除状态。其本质也就是一个瞬时状态的对象。
脏数据更新
一个持久状态对象在事务管理内,如果改变原来的数据(非主键),此时出现脏数据,在事务提交的时候自动发出update语句去修改。
脏数据执行流程
第一步:拿到entityManager,开启事务
第二步:通过entityManager拿到一个对象,那么现在这个对象就是持久化的对象
这个对象会放到一级缓存里面
JPA会为当前这个对象准备一个快照(把这个对象进行了备份)
第三步:提交事务
它会把快照 与 你现在这个对象的数据进行对比
如果相同,就不需要修改,也不会发送SQL(性能就高了)
当不相同的时候,JPA就会认为现在这个数据是脏数据
脏数据它就会在事务提交的时候,把它进行数据库的同步(发送update SQL语句)
@Test
public void update() throws Exception {
save();

EntityManager entityManager = JPAUtils.getEntityManager();
entityManager.getTransaction().begin();

StateDomain stateDomain = entityManager.find(StateDomain.class, 1L);// 持久状态
stateDomain.setName(“stateDomain”);
// 写不写效果是一样
entityManager.merge(stateDomain);// 持久状态

entityManager.getTransaction().commit();
entityManager.close();// 游离状态
}
持久对象(domain层)定义规则
1.类不能定义为final类
因为domain类需要被继承的,否则延迟加载会失效
2.所有属性的类型都必须是包装类型
不能是8个基本类型(int,byte,short,long,char,boolean,float,double)
因为JPA内部代码很多判断都是基于是否等于null
3.必须有默认无参构造方法
因为find方法获取的时候会在内存实例化domain对象
否则报org.hibernate.InstantiationException: No default constructor for entity异常

identifier of an instance of
持久状态的对象是不能修改OID(不能修改主键)
持久层修改id会报下面的错误,大家要注意小心:
org.hibernate.HibernateException: identifier of an instance of cn.itsource.jpa.state.StateDomain was altered from 1 to 200

@Test
public void update2() throws Exception {
save();

EntityManager entityManager = JPAUtils.getEntityManager();
entityManager.getTransaction().begin();

StateDomain stateDomain = entityManager.find(StateDomain.class, 1L);// 持久状态
stateDomain.setId(200L);
// 修改持久对象
entityManager.merge(stateDomain);// 持久状态

entityManager.getTransaction().commit();
entityManager.close();
}

域对象(domain对象)之间的关系

3.1.依赖关系
JavaBean之间的依赖关系
分层:表现层,业务层,持久层(依赖关系)
依赖:一般指controll,service,dao层之间的关系
类之间访问关系。无需定义成属性。在A中访问B中的方法或属性,或者A负责实例化B。
xxxService{
IXxxDao xxxDao = new XxxDaoImpl();//原来

使用Spring之后,通过set方法依赖注入xxxDao的实例
(对象实例化交给spring完成)
IXxxDao xxxDao ;
public void setXxxDao(IXxxDao xxxDao){
this.xxxDao=xxxDao;
}
}
Controller表现层依赖于Service业务层,Service依赖于Dao持久层
3.2.关联关系
类之间的引用关系,以属性定义的方式表现。
关联按照多重性可分为一对一、一对多、多对一和多对多。 主要指的数据库(类)的关系
按照导航性可分为单向关联和双向关联。
主要指的java类的导航,导航可以从一个类获取另一个的类的实例
员工和部门是什么关系? 多个员工对应一个部门 多对一
一个类的对象与它的属性之间的关系

注意:关系的判定一定要根据一般的情况,而不是特殊的情况

注:我们讲的是关系是域对象的关系,与数据库无关
一对一 : QQ(主一)与QQ空间(从一),一夫一妻,一个人一个身体证
多对一(反过来就是一对多) :多个员工都是一个老板 , 多把钥匙对于一把锁,一个部门多个员工,一个产品类型有多个产品
多对多:老师与学生,司机与公交车,用户与角色

注意:
不管理一对多,还是多对多(不管它们是双向还是单向),数据库的结构不变(多方有外键)
多对多:必有一张中间表
一对一:设计方案(共享主键,唯一外键),主从关系
3.3.聚合关系(本质还是双向多对一,一对多)
表示整体与部分的关系,整体和部分可以分开单独存在。
电脑(主板,CPU,IO,内存条)
3.4.组合关系(本质还是聚合关系,双向多对一,一对多)
强聚合关系,整体和部分之间不能分开。
人(头,手),订单模型,超市购物购物清单
有的设计,是一定要在强聚合关系下才使用
组合关系在后面进销存系统详细讲,只需要了解。

指的是类与类之间的继承关系设置
Animal --》 Person Pig Cat Bird

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值