传智播客-jpa与hibernate(2)-CRUD和关联关系

抖音直播参数逆向实战:手把手教你用Python获取ttwidx-bogus(附完整代码) 本文深入解析抖音直播接口的反爬机制,重点剖析核心防护参数ttwidx-bogus的生成原理作用。通过Python实战,手把手教你逆向获取ttwid、webid等关键参数,并构建稳定的数据采集方案,为开发者提供企业级数据获取能力。 阅读详情

(传智播客ms很多关于“数据”的课程都是徐培成老师讲的,hibernate、jpa、后面还有个数据采集课程,当然还有讲解其他课程,赞一下,课讲得确实很好,尤其是课上没有半句废话--对于号称笔记狂的本人而言恨不得每个字都记下来,而且看得出确实经验丰富。当然,本人博客里提到的其他老师也都很好~最最起码的,能看出大家都很敬业。本人一直都认为,做事最重要的就是看态度。常言道:能力可以培养,态度难以改变 >_<come on!)

 

CRUD
1、下面代码中,注释中的“===>”左边是纯jpa规范的表示,右边是hibernate表示。
2、jpa与hibernate在CRUD中最显著的区别在于“U”--更新,即jpa里的merge()方法,相当于hibernate的update()。
(1)更新是将游离状态的数据对象的引用与缓存关联,使成持久态。所谓在缓存里添加一个对象,其实添加的只是引用。
(2)只调用merge()方法不会有update语句打印,因为merge()方法是在缓存里新建了一个对象的拷贝,并返回这个拷贝,merge()操作的也是这个拷贝,所以下面的代码中,c.setName("jerry2")其实并没有更新,cc.setName("jerry3")才真正被更新了。
3、EntityManager/Session的CRUD操作只是最基本最简单的操作,实际业务逻辑中更多用的是EntityManager.createQuery()--针对相应业务逻辑创建sql语句,还有EntityManager.createNamedQuery()/Session.getNamedQuery()--这样的话查询语句可以做成配置信息,方便统一修改,而hibernate自身还有一个Criteria对象,Session.createCriteria()可以创建更体现00P思想的sql。
public class TestCrud {

 private static EntityManagerFactory emf = null;
 
 @BeforeClass
 public static void iniEmf(){
  try {
   emf = Persistence.createEntityManagerFactory("jpa");
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
 
 @Test
 public void findCustomer(){
  //em ===> session
  EntityManager em = emf.createEntityManager();
  EntityTransaction tx = em.getTransaction();
  tx.begin();
  //em.find() ===> session.get(), 不能产生代理
  CustomerBackup c = em.find(CustomerBackup.class, 4);
  System.out.println(c); //如果c不存在,不报错,直接返回null
  tx.commit();
  em.close();
 }
 
 @Test
 public void getReference(){
  EntityManager em = emf.createEntityManager();
  EntityTransaction tx = em.getTransaction();
  tx.begin();
  //em.getReference() ===> session.load()
  CustomerBackup c = em.getReference(CustomerBackup.class, 4); //返回的是代理对象
  System.out.println(c); //如果c不存在,会报找不到实体c的错误
  tx.commit();
  em.close();
 }
 
 @Test
 public void updateCustomer(){
  EntityManager em = emf.createEntityManager();
  EntityTransaction tx = em.getTransaction();
  tx.begin();
  //em.find() ===> session.load()
  CustomerBackup c = em.find(CustomerBackup.class, 1); //持久化数据的更新,缓存里有快照,即副本
  c.setName("jay");
  tx.commit();
  em.close();
 }
 
 @Test
 public void updateCustomer2(){
  EntityManager em = emf.createEntityManager();
  EntityTransaction tx = em.getTransaction();
  tx.begin();
  //em.find() ===> session.load()
  CustomerBackup c = em.find(CustomerBackup.class, 1);
  tx.commit();
  em.close();
  
  em = emf.createEntityManager();
  tx = em.getTransaction();
  tx.begin();
  //em.merge()合并 ===> session.update()
  CustomerBackup cc = em.merge(c); //将游离状态对象的引用和缓存关联,使其变为持久化状态
  //这一句放em.merge(c)前后都无所谓,因为c这时还在缓存里,而merge关联的只是引用
  c.setName("jerry2");
  //merge方法实际上是新建一个对象的拷贝,然后对这个拷贝操作,所以对merge返回的对象拷贝进行操作才能真正执行更新
  cc.setName("jerry3"); //这句才真正被更新了
  tx.commit();
  em.close();
 }
 
 @Test
 public void removeCustomer(){
  EntityManager em = emf.createEntityManager();
  EntityTransaction tx = em.getTransaction();
  tx.begin();
  CustomerBackup c = em.find(CustomerBackup.class, 1);
  //em.remove(c) ===> session.delete(c)
  em.remove(c);
  tx.commit();
  em.close();
 }
 
 @Test
 public void findAllCustomer(){
  EntityManager em = emf.createEntityManager();
  EntityTransaction tx = em.getTransaction();
  tx.begin();
  //jpql
  //只写from Customer c也可以,但是这种语法(可能)只有hibernate才支持,为了提高程序可移植性,应当完整写明
  Query q = em.createQuery("select c from CustomerBackup c");
  //q.getResultList()(jpa) ===> q.list()(hibernate)
  q.getResultList();
  tx.commit(); //这一句才在真正执行了查询,前面只是构建生成sql语句
  em.close();
 }
}

4、jpa里的@Embedded注释相当于hibernate里的component元素,是一个实体类的实体类型属性(相对于值类型属性而言,从java的角度来看,就是一个类与另一个类的组成关系)
(1)属性重写:如果实体类(例如Customer类)里有多个同一实体类型(例如Address类)的属性(例如homeAddress,comAddress),那么原有实体类型里面的属性(相对于表的字段)需要重写。
(2)空指针判断:以(1)为例,如果数据库里homeAddress或comAddress相关内容字段全为null,那么jpa直接将查找的customer对象的homeAddress或comAddress属性值置为null,而不会为这个属性new一个新对象(空间),所以更新该属性数据时,应该事先做一下空指针判断,并将指针移位,以增强程序的健壮性(当然,如果只要有一个字段值不为null,jpa就会new个新对象了~~~)。
@Test
public void findCustomer(){
 EntityManager em = emf.createEntityManager();
 EntityTransaction tx = em.getTransaction();
 tx.begin();
 Customer c = em.find(Customer.class, 1);
 Address ca = c.getComAddress();
 if(ca == null){
//空指针判断
  ca = new Address();
  c.setComAddress(ca);
//c原来指向null的 指针 转移到ca对象
 }
 tx.commit();
 em.close();
}

 

关联关系
(级联--指数据信息传播的支持程度,即使只CUD操作一个实体,相关的也会CUD。)
1、多对一和一对多
(1)@ManyToOne一方(例如Order),不加@JoinColumn的话,hibernate会自动添加一个连接字段,字段名为“many类中one类型的属性名_对端主键字段值”。
(2)查询order的话打印出的sql语句为左外连接:Order left outer join Customer。
(3)@OneToMany一方,jpa默认采用中间表来实现,所以通常情况应该指定一个连接列,但是因为在many一方中不用维护关联关系,一般由one一方维护,所以应该使用@OneToMany(MappedBy="customer")。
(4)下列代码运行后,order表的业务数据可以插入,但是负责关联关系的customer_id外键值为null,因为customer_id的值应该由有关系控制权的customer来指派。
//order.setCustomer(customer);
customer.getOrders().add(order);
entityManager.persist(customer);
//entityManager.persist(order);

 

2、一对一
(1)外键关联
public class Customer{
 @OneToOne
 @JoinColumn(name="aid",referencedColumnName="id") //"id"是指Address的id属性值
 private Address addr;
 ......
}
public class Address{
 @OneToOne(MappedBy="aid",unique=true) //加了unique=true才能保证一对一关联的双向唯一性
 private Customer customer;
 ......
}
(2)主键关联
主键关联中必有一方为自然主键,保存前必须手动为其赋值。(具体如何使用请参见相关文档,代码就不贴了,不过官方文档中不推荐这种做法)

 

3、多对多
一般是建一个中间表关联双方,表内字段为双方主键字段。其实也可以看成多对一和一对多的复合,这个就不多写了。。(手又酸了呀。。。)

《iOS之一起进大厂》系列-秒杀面试官的RunLoop底层原理面试题 Runloop是iOS面试中的必考题,不管大厂小厂都会问到。 这里包括了Runloop几乎所有的面试题,还有中肯完整的答案解释。 阅读详情

相关推荐

KIBANA可视化管理界面说明

更说明转自https://blog.csdn.net/IT_ZRS/article/details/125496588 1 主要结构功能 使用浏览器访问 ip:5601 默认端口,进入首页 Discover:日志管理视图 主要进行搜索查询 Visualize:统计视图 构建可视化的图表 Dashboard:仪表视图 将构建的图表组合形成图表盘 Timelion:时间轴视图 随着时间流逝的数据 APM:性能管理视图 应用程序的性能管理系统 Canvas:大屏展示

tian830937的专栏 7040

传智博客CSDN的关系

我才进CSDN没多久,一直也没去用!没时间用,最近突然喜欢在论坛上帮别人回回贴了,刚开始几天进来,刚觉CSDN挺好的,服务器挺快的! 不说还好,一说,马上发现自己的浏览器上全部是挂满了广告,而最多的是传智博客的。论坛中也有很多是传智博客的学生,或者已经出去的学生了。 我就纳闷了,为什么论坛上那么多帖子都在说到传智博客培训怎么样?我之后我无意中在论坛上看到一个群加了进去,有...

weixin_34414196的博客 183

生信人的一天~HIFI数据+HIC数据组装基因组

HIFI+HIC数据组装基因组!

qq_43337286的博客 9476

CSDN发展历史

CSDN发展历程。

apk__的博客 1307

传智播客到底在坚持什么?

传智播客致广大学员的一封信已经过去1个月有余了,但是在网上余温仍在,更有一些机构争相模仿,但你们已跑偏了。无数的学员在质疑一个培训机构,在暑期这样招生旺季的时候,你不火力全开,争抢生源市场份额,你在干什么?是的,现在是暑期,是一年一度IT培训机构招生的好时机,所以很多机构都摩拳擦掌、跃跃欲试,纷纷在广告市场推广方面加大投资,用铺天盖地的广告吸引学员的眼球,试图广招天下学员。但是传智播客却打出了,6、7月份不招生的口号。传智播客也需要生存,这样做也并非任性。

黑马程序员官方博客 8188

传智播客jpa学习,jpa整合hibernate

      今天学习jpa,黎活明老师讲的,黎老师讲到,jpa可以简化现有的持久化开发工作整合ORM技术,他的使用会越来越广。今天主要学习了它的技术原理,开发环境配置。      JPA(Java Persistence API)是Sun官方提出的Java持久化规范。它为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据。他的出现主要是为了简化现有的持久化开发工作整合O

TuiRoger的专栏 1722

传智播客--JPACRUD操作,映射实体

没有学习之前就听说过 JPA ,开始想自学来着.不知道为什么总是感觉这个技术很难.所以都没有尝试过.今天通过老师的讲解,很快就上手了.呵呵,好多问题其实没有自己想象的那样难.这个人真的是感觉有点意思. JPA 的为了使项目中持久层的 ORM 项目解耦而出现的技术.无论项目的持久层由什么 ORM 来实现都对项目上层调用的代码没有影响.这里我们用 hibernate 来是 JPA 的实现

图画hadoop 1332

Spring Data JPAJPAhibernate之间的关系2

Spring Data JPA 是 Spring 基于 ORM 框架、JPA 规范的基础上封装的一套JPA应用框架,可使开发者用极简的代码即可实现对数据库的访问操作。它提供了包括增删改查等在内的常用功能 关系JPA是一套规范,内部是有接口抽象类组成的。hibernate是一套成熟的ORM框架,而且Hibernate实现了JPA规范,所以也可以称hibernateJPA的一种实现方式,我们...

weixin_42030357的博客 253

ORM思想 JDBC规范 hibernate Jpa规范 Spring Data Jpa

本篇文章为黑马程序员传智播客的记录,方便自己复习 简单介绍: ORM思想: Object Relationship Mapping -----对象关系映射 目的:操作POJO(实体类)等价于操作数据库的表 ①POJO类表的映射关系 ②POJO类中属性表中字段的映射关系 JDBC: 只需要修改一下连接接口的规则其他的少量的地方即可使用多个数据库 hibernate: 一个开源的对象关系映射框架,他对JDBC进行了非常轻量级的对象封装,他将POJO(实体类)数据库的表建立映射关系,是一个全自动的OR

BOWWOB的博客 329

Spring Data JPA

一、JPA概述及基本操作 1、ORM思想 ORM(Object-Relational Mapping) 表示对象关系映射。 目的:通过操作实体类就可以对数据库表进行操作 建立两个映射: 实体类表的映射 实体类属性表中字段的映射 实现ORM思想的框架:Hibernate、mybatis 2JPA的介绍 Hibernate封装jdbc,是一个orm关系对象映射框架,可以自动生成sq...

USTSD的博客 108

传智播客学习之JPA

今天是上课的第一天,由徐老师给我们上JPA的课,新年过后,这是一个惊喜,因为又是徐老师带我们的课程,大家都十分喜欢徐老师,因为自从听完Hibernate后,“徐侠客”这三个字已经深深扎在我们班的每个同学心里了。今天也大家分享一下JPA相关知识,虽然JPA在国内还不是很火,但是在国外,JPA的使用还是十分多的,而且JPA在未来还是很有发展前景的。一、JPA概述JPA(Java Pe

qinli_2009的专栏 655

传智播客java学习--jpa初步

我今天学习了徐老师讲的jpa,我做了简单的笔记: JPA(Java Persistence API)是Sun官方提出的Java持久化规范。它为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据。他的出现主要是为了简化现有的持久化开发工作整合ORM技术,结束现在Hibernate、TopLink等ORM框架各自为营的局面。值得注意的是,JPA是在充分吸收了现有H

274

SSH2 主要知识点+SSH2的jar包详解

以下为我下载的传智播客视频里SSH视频的目录,感觉总结的挺好,SSH2学习中一直由这套视频伴随着我 SSH2要点: Struts2.1.8 要点: 01 struts2及struts2开发环境的搭建 02 第一个struts2应用开发 03 解决struts2配置文件无提示问题 04 Action名称的搜索顺序 05 Action配置的各项默认值 06 result配置的各

走在java的路途上 1313

jpa入门

1.表对应的实体类 @Entity //声明实体类 @Table(name = "cst_customer") //实体类表建立映射关系 public class Customer { @Id //主键 @GeneratedValue(strategy = GenerationType.IDENTITY)//主键自增 @Column(name =...

weixin_33795093的博客 80

Hibernate Criteria对象详解(条件查询)

Hibernate Criteria对象详解 2014-9-1 16:21| 发布者: 传智特刊| 查看: 7290| 评论: 0 摘要: Hibernate框架是目前JavaEE软件开发的企业主流框架,学习Hibernate必然要掌握ORM(对象关系映射Object/Relation Mapping)的概念思想, Hibernate拥有完全的ORM理念,我们在操作数据库时,可以通过面

遨游大海 4366

JPA介绍,以及开发环境介绍

JPA概念   JPA(JAVA Persistence API)是sun官方提出的Java持久化规范。他为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据库。他的出现主要是为了简化现有的持久化开发工作整合ORM技术,结束现在Hibernate,TopLink,JDO等ORM框架各自为营的局面。   JPA是在充分吸取了现有的Hibernate,TopLink等OR...

sefcertyu 167

Hibernate 学习笔记

1.HelloWorld cfg.xml配置文件,copy  改mysql,name password 、MySQLDirlect等。创建数据库表,创建表名同名的类,对应的id name(配置文件,将实体类映射到数据库中的表  hbm.xml)  创建测试类,config session,getTransaction,commit。 MySQL图形化管理工具 Navicat for My...

qq_39054417的博客 249

Hibernate Criteria对象详解

原文地址:http://bbs.itcast.cn/article-211-1.html Hibernate Criteria对象详解 2014-9-1 16:21| 发布者: 传智特刊| 查看: 9798| 评论: 0 摘要: Hibernate框架是目前JavaEE软件开发的企业主流框架,学习Hibernate必然要掌握ORM(对象关系映射Obje

wxg1453149997的专栏 589

洗衣店小程序V2.4.3完整安装包+小程序前端.zip

洗衣店小程序V2.4.3完整安装包+小程序前端

google谷歌提示工程(中英精翻版本) (1).pdf

google谷歌提示工程(中英精翻版本) (1).pdf

上一篇: 传智播客-jpa与hibernate(1)-实体和主键生成
下一篇: 传智播客-jpa与hibernate(3)-继承映射
fjf133
博客等级 码龄18年 19粉丝 56原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值