JPA 入门程序及相关注解
1. 概述
- JPA(Java Persistence API):用于对象持久化的API;
- JPA本质上是一种ORM规范,不是ORM框架;提供了一些编程的API接口;
- Hibernate是实现;
1.1 JPA 包括三方面的技术
- ORM映射元数据:JPA支持XML和JDK5.0注解两种元数据的形式;
- JPA的API:用于操作实体对象,执行CRUD操作;
- 查询语言(JPQL)
2. Hello World
- 创建
persistence.xml
,配置持久化单元- 指定跟哪个数据库进行交互;
- 指定JPA使用哪个持久化框架以及配置该框架的基本属性;
- 创建实体类,使用注解来描述实体类与数据库表之间的映射关系;
- 使用JPA API完成数据增删改查
- 创建EntityManagerFactory(对应Hibernate中的SessionFactory);
- 创建EntityManager(对应Hibernate中的Session)
2.1 使用Eclipse,创建JPA工程
2.2 导入所需JAR包
2.3 配置persistence.xml
文件
<persistence-unit name="jpa001" transaction-type="RESOURCE_LOCAL">
<!-- 配置使用什么ORM产品来作为 JPA 的实现 -->
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<!-- 添加持久化类 -->
<class>com.noodles.jpa.helloworld.Customer</class>
<properties>
<!-- 连接数据库的基本信息 -->
<property name="javax.persistence.jdbc.url" value="jdbc:mysql:///jpa"/>
<property name="javax.persistence.jdbc.user" value="root"/>
<property name="javax.persistence.jdbc.password" value="root"/>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<!-- 配置JPA, 配置 hibernate 的基本属性 -->
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
</properties>
<persistence-unit>
2.4 创建实体类
// com.noodles.jpa.helloworld.Customer
@Table(name="JPA_CUSTOMERS") // 对应数据库中的表名
@Entity
public class Customer{
private Integer id;
private String lastName;
private String email;
private int age;
@GeneratedValue(strategy=GenerationType.AUTO)
@Id
public Integer getId(){
return id;
}
public void setId(Integer id){
this.id = id;
}
@Column(name="LAST_NAME") // 表中列名与字段不一致,需要添加注解
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
2.5 编写主函数类
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
public class Main{
public static void main(String[] args){
// 1. 创建 EntitymanagerFactory
String persistenceUnitName = "jpa001";
EntityManagerFactory entityManagerFactory =
Persistence.createEntityManagerFactory(PersistenceUnitName);
// 2. 创建 EntityManager
EntityManager entityManager = entityManagerFactory.createEntityMnager();
// 3. 开启事务
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
// 4. 进行持久化操作
Customer cus = new Customer();
cus.setAge(15);
cus.setEmail("noodlescnliu@gmail.com");
cus.setLastName("Noodles");
// 5. 提交事务
transaction.commit();
// 6. 关闭 EntityManager
entityManager.close();
// 7. 关闭 EntitymanagerFactory
entityManagerFactory.close();
}
}
3. JPA 基本注解
3.1 @Entity
- 用于实体类声明语句之前,指出该Java类为实体类,将映射到指定的数据库表;
3.2 @Table
- 当实体类与其映射的数据库表名不同时,需要使用
@Table
标注说明; @Table
标注的常用选项是name
,用于指明数据库的表名;@Table
标注还有catalog
和schema
用于设置表所属的数据库目录或模式,通常为数据库名;
3.3 @Id
- 用于声明一个实体类的属性映射为数据库的主键;
- 通常置于属性的
getter
方法之前;
3.4 @GeneratedValue
- 用于标注主键的生成策略,通过
strategy
属性指定;IDENTITY
:采用数据库ID自增长的方式来自增主键字段;Oracle不支持这种方式;AUTO
:JPA自动选择合适的策略,是默认选项;SEQUENCE
:通过序列产生主键,MySQL不支持这种方式;TABLE
:通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以是应用更易于数据库移植;
3.5 @Basic
- 表示一个简单的属性到数据库表的字段的映射,对没有任何标注的getXxx()方法,默认即为
@Basic
;fetch
:表示该属性的读取策略,有 EAGER 和 LAZY 两种;optional
:表示该属性是否允许为null,默认为true;
3.6 @Column
- 当实体的属性与其映射的数据库表的列不同名时,需要使用;
name
:用于设置映射数据库表的列名;length
:定义列的长度;columnDefinition
:表示该字段在数据库中的实际类型;
3.7 @Transient
- 表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性;
3.8 @Temporal
- 用于调整Date类型的精度,用三种精度:DATE,TIME或TIMESTAMP
@Temporal(TemporalType.TIMESTAMP)
4.JPA 相关API
4.1 EntityManager
- 实体的状态:
- 新建状态:新创建的对象,尚未拥有持久性主键;
- 持久化状态:已经拥有持久性主键并和持久化建立了上下文环境;
- 游离状态:拥有持久化主键,但是没有与持久化建立上下文环境;
- 删除状态:拥有持久化主键,已经和持久化建立上下文环境,但是从数据库中移除;
find(Class<T> entityClass, Object primaryKey)
:类似于Hibernate中Session的get方法;getReference()
:类似于Hibernate中Session的load方法;persist()
:类似于Hibernate中Session的save方法,使对象由临时状态变为持久化状态;remove()
:类似于Hibernate中Session的delete方法,把对象对应的记录从数据库中移除;只能移除持久化对象,
而Hibernate的delete方法实际上,还可以移除游离对象;flush()
:将持久上下文环境的所有未保存实体的状态信息保存到数据库中;refresh()
:用数据库实体记录的值更新实体对象的状态,即更新实例的属性值;merge(T entity)
:拥有处理Entity的同步,即数据库的插入和更新操作;
参考资料:
JPA 入门程序及相关注解的更多相关文章
- springBoot注解大全JPA注解springMVC相关注解全局异常处理
https://www.cnblogs.com/tanwei81/p/6814022.html 一.注解(annotations)列表 @SpringBootApplication:包含了@Compo ...
- 零基础学习java------38---------spring中关于通知类型的补充,springmvc,springmvc入门程序,访问保护资源,参数的绑定(简单数据类型,POJO,包装类),返回数据类型,三大组件,注解
一. 通知类型 spring aop通知(advice)分成五类: (1)前置通知[Before advice]:在连接点前面执行,前置通知不会影响连接点的执行,除非此处抛出异常. (2)正常返回通知 ...
- [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:为ASP.NET MVC应用程序读取相关数据
这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第七篇:为ASP.NET MVC应用程序 ...
- [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:为ASP.NET MVC应用程序更新相关数据
这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第八篇:为ASP.NET MVC应用程序 ...
- 01_Spring入门程序
一.什么是Spring? 1.Spring是分层的JavaSE/EE full-stack(一站式) 轻量级开源框架 2.spring是一个高度灵活的轻量级框架,其目的是降低企业级应用开发的复杂度. ...
- Spring Data Jpa 入门学习
本文主要讲解 springData Jpa 入门相关知识, 了解JPA规范与Jpa的实现,搭建springboot+dpringdata jpa环境实现基础增删改操作,适合新手学习,老鸟绕道~ 1. ...
- JPA入门例子(采用JPA的hibernate实现版本) 转
JPA入门例子(采用JPA的hibernate实现版本) jpahibernate数据库jdbcjava框架(1).JPA介绍: JPA全称为Java Persistence API ,Java持久化 ...
- 【mybatis深度历险系列】mybatis的框架原理+入门程序解析
在前面的博文中,小编介绍了springmvc的相关知识点,在今天这篇博文中,小编将介绍一下mybatis的框架原理,以及mybatis的入门程序,实现用户的增删改查,她有什么优缺点以及mybatis和 ...
- JAVAEE——SpringMVC第一天:介绍、入门程序、架构讲解、SpringMVC整合MyBatis、参数绑定、SpringMVC和Struts2的区别
1. 学习计划 第一天 1.SpringMVC介绍 2.入门程序 3.SpringMVC架构讲解 a) 框架结构 b) 组件说明 4.SpringMVC整合MyBatis 5.参数绑定 a) Sp ...
随机推荐
- error: invalid use of incomplete type
一般出现这种情况都是没有将用到的头文件包含进来 我的情况是在头文件中定义了一个QMenu的指针,在源文件中使用menuBar()函数来返回一个menu指针.我在源文件中包含了文件<QtGui&g ...
- [转]JavaScript放在<head>和<body>的区别
原文:http://liminhappygirl.iteye.com/blog/1841360 javaScript放在<head>和<body>的区别: 在HTML body ...
- xadmin 问题总结
pip install django-import-export
- nginx日志自动切割
1.日志配置 Nginx 日志分 access.log 记录哪些用户,哪些页面以及用户浏览器,IP等访问信息: error.log 记录服务器错误的日志 配置日志存储路径 location / { a ...
- Windows Phone实用教程:利用Blend为程序添加设计时数据
[前言] Blend自诞生那一天起就伴随这开发者如此的评价: 有VS还用Blend干啥,直接码代码就好了. Blend会生成一堆垃圾无用代码,很不爽. 对于这类我只会在心里评价,当你并不真正了解一样事 ...
- 纯CSS炫酷3D旋转立方体进度条特效
在网站制作中,提高用户体验度是一项非常重要的任务.一个创意设计不但能吸引用户的眼球,还能大大的提高用户的体验.在这篇文章中,我们将大胆的将前面所学的3D立方体和进度条结合起来,制作一款纯CSS3的3D ...
- 很多人都不知道的监听微信、支付宝等移动app及浏览器的返回、后退、上一页按钮的事件方法
版权声明:本文为博主原创文章,未经博主允许不得转载. 在实际的应用中,我们常常需要实现在移动app和浏览器中点击返回.后退.上一页等按钮实现自己的关闭页面.调整到指定页面或执行一些其它操作的 需求,那 ...
- Unity UGUI 实现简单拖拽功能
说到拖拽,那必然离不开坐标,UGUI 的坐标有点不一样,它有两种坐标,一种是屏幕坐标,还有一种就是 UI 在Canvas内的坐标(暂时叫做ugui坐标),这两个坐标是不一样的,所以拖拽就需要转换. 因 ...
- (转)Spring AOP编程原理、Demo
转自: http://pandonix.iteye.com/blog/336873/ AOP原理: http://blog.csdn.net/moreevan/article/details/1197 ...
- 简易博客开发(8)----django1.9 博客部署到pythonanywhere上
准备工作 首先需要注册一下,pythonanywhere的免费账户有一定的限制,只能创建一个web app,不能绑定独立域名,不能通过ssh连接,不过只是搭一个project也是够用了. 注册成功之后 ...