JPA API与注解
一、JPA API
- Persistence 类:用于获取 EntityManagerFactory 实例,该类含有静态方法 createEntityManagerFactory。
//persistence.xml 中的 persistence-unit
String persistenceUnitName = "jpa-1";
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory(persistenceUnitName);
还可以使用 map 来配置 hibernate。
Map map = new HashMap<String, Object>();
map.put("hibernate.show_sql", false);
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory(persistenceUnitName, map);
EntityManagerFactory 接口:创建 EntityManager 实例,该接口有以下几个方法:
- createEntityManager():用于创建实体管理对象实例。
- isOpen():检查 EntityManagerFactory 是否处于打开的状态。默认创建后就一直是打开的,除非调用close() 方法将其关闭。
- close():关闭 EntityManagerFactory, EntityManagerFactory 关闭后将释放所有资源,其他方法将不能调用,否则将导致 IllegalStateException 异常。
EntityManager 类:该类是完成持久化操作的核心对象,实体作为普通的 Java 对象,只有在调用 EntityManager 将其持久化后才会变成持久化对象。它有以下几个方法:
find(Class entityClass,Object primaryKey):返回指定的 OID 对应的实体类对象。
//若 OID 不存在于数据库中,则会返回一个 null
Customer c = entityManager.find(Customer.class, 2);
getReference (Class entityClass,Object primaryKey):与 find 方法类似,但是采用懒加载的方式,并且如果数据库中不存在此 OID,会抛出 EntityNotFoundException。
//若 OID 不存在于数据库中,则会抛出 EntityNotFoundException 异常
Customer c = entityManager.getReference(Customer.class, 2);
// 由于懒加载,此行结果会先于 SQL 语句显示出来
System.out.println("-------");
System.out.println(c.getLastName());
persist(Object entity):用于将新创建的 Entity 从新建状态转为持久化状态即插入数据,也能更新数据。
Customer customer = new Customer();
customer.setAge(15);
customer.setLastName("Tom");
customer.setEmail("Tom@163.com"); entityManager.persist(customer);
Customer customer = entityManager.find(Customer.class, 1);
customer.setLastName("Tom");
entityManager.persist(customer);
remove(Object entity):将实体的状态从持久化状态变为删除状态,并从数据库中删除相应的记录。
//实体不能是游离态的,否则会抛出异常,例如以下就是不行的
// Customer c = new Customer();
// c.setId(2);
// entityManager.remove(c);
Customer customer = entityManager.find(Customer.class, 2);
entityManager.remove(customer);
merge(T entity):用于处理 Entity 的同步。即数据库的插入和更新操作。

此外 EntityManager 还有一些其他的方法,实际用到了再查阅吧。
EntityTransaction:事务管理类,有以下一些方法:
- begin():启动一个事务
- commit():提交一个事务
- rollback():回滚一个事务。
- isActive():查看当前事务是否是活动的,若为 true,则不能调用 begin()开启事务。
扩:实体的状态
- 新建状态:新创建的对象,尚未拥有持久化主键。
- 持久化状态:有持久化主键并和持久化建立了上下文环境。
- 游离状态:有持久化主键,但是没有和持久化建立上下文环境。
- 删除状态:拥有持久化的主键并和持久化建立了上下文环境,但是已从数据库中删除。
注:在这里,建立上下文环境就是与 EntityManager 关联。
二、JPA 注解
下面就来介绍些 JPA 中常见的注解。
@Entity 注解:用于实体类声明语句之前,指出该 Java 类为实体类,并映射到指定的数据库表中。
@Entity(name = "customers") // 将 Customer 类 映射到 cutomers 表中
public class Customer {
@Basic 注解:表示实体类中的属性到数据表中字段的映射,对于没有任何标注的 getXxx()方法,默认就是@Basic。
// 默认情况下,就是@Basic 注解,email 属性映射成表中的 email字段
public String getEmail() {
return email;
}
@Column 注解:指定属性映射成表中的特定名字字段,即属性和表中字段不同名。
//将lastName 映射成表中的 last_name 字段
@Column(name = "last_name")
public String getLastName() {
return lastName;
}
@Id 注解:用于将此属性映射成数据表中的主键列。该注解往往也和 @GeneratedValue 注解一起使用,用于标注生成主键的策略。
// 表示 id 属性映射成数据表中的主键列,并使用自动递增的生成策略
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Integer getId() {
return id;
}
@Transient 注解:表示该属性不映射数据表中的字段。若某个属性不是数据表中的字段,则必须加上此注解,因为 ORM 框架默认属性的注解为 @Basic。
@Temporal 注解:在核心的 Java API 中日期、时间的类型都是 Date,而在数据库中却有DATE,TIME TIMESTAMP 或者混用,所以若要精确日期或时间,就需要使用此注解。
//映射到数据库中的birth字段形如 2018-06-02,不加该注解,表中字段形如2018-06-02 12:22:12
@Temporal(TemporalType.DATE)
public Date getBirth() {
return birth;
}
JPA API与注解的更多相关文章
- JPA学习(2)注解
上一篇学习了JPA的helloworld,也初略的使用了一些注解,接下来就细细的了解一下有哪些注解,和这些注解的作用 JPA的基本注解: ①@Entity,@Table,@Id,@GeneratedV ...
- 利用Eclipse的JPA自动生成注解实体
新公司用的SSH(springmvc)框架,看代码的时候,发现没有hbm.xml文件,全部使用的注解形式.在一次闲聊的时候问同事,这么多entity 写起来不麻烦么.同事说根据数据库自动生成的.于是 ...
- 使用JPA中@Query 注解实现update 操作
spring使用jpa进行update操作主要有两种方式: 1.调用保存实体的方法 1)保存一个实体:repository.save(T entity) 2)保存多个实体:repository.sav ...
- JPA之@GeneratedValue注解(转)
JPA的@GeneratedValue注解,在JPA中,@GeneratedValue注解存在的意义主要就是为一个实体生成一个唯一标识的主键(JPA要求每一个实体Entity,必须有且只有一个主键), ...
- 二十、springboot之jpa开发@MappedSuperclass 注解说明
@MappedSuperclass使用条件: 当我们进行开发项目时,我们经常会用到实体映射到数据库表的操作,此时我们经常会发现在我们需要映射的几个实体类中,有几个共同的属性,例如编号ID,创建者,创建 ...
- JPA之@GeneratedValue注解
JPA的@GeneratedValue注解,在JPA中,@GeneratedValue注解存在的意义主要就是为一个实体生成一个唯一标识的主键(JPA要求每一个实体Entity,必须有且只有一个主键), ...
- jpa和hibernate注解
http://www.objectdb.com/api/java/jpa/JoinColumns 用hibernate和jpa annotation 大概一年多了,今天闲来无事,对他们关联关系元数据写 ...
- JPA的Column注解总结
就像@Table注解用来标识实体类与数据表的对应关系类似,@Column注解来标识实体类中属性与数据表中字段的对应关系. 该注解的定义如下: @Target({METHOD, FIELD}) @Ret ...
- JPA实体类注解、springboot测试类、lombok的使用
前提准备: 搭建一个springboot项目,详情请参见其它博客:点击前往 1 引入相关依赖 web.mysql.jpa.lombok <?xml version="1.0" ...
随机推荐
- ssh服务常见问题及其解决办法
1 统一解决办法 执行sshd -t,这样就可以指出是哪里出问题了. 所有的服务都应该有这个测试选项,否则出错了都不知道在哪里出的问题. 2 root用户登录,密码是对的,但是报“Permission ...
- 混合使用Delphi和C ++(附下载)
您想将C ++添加到Delphi应用程序中吗?或者将Delphi代码添加到C ++应用程序中?这是如何做. 您可能不知道的一件事是如何在RAD Studio中集成C ++和Delphi语言.您可以将单 ...
- css3 3d特效汇总
本篇全是实战,没有基础,如果不明白3d特效的原理,可能会看不懂,不过没关系,给你推荐一下 张鑫旭css3 3d转换,或者看我的另一篇博客 css3 2d转换3d转换以及动画的知识点汇总,看完这些3d ...
- POJ 3650:The Seven Percent Solution
The Seven Percent Solution Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7684 Accep ...
- hdoj--1716--排列2(暴力水题)
排列2 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- bzoj1999 (洛谷1099) 树网的核——dfs
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1999 https://www.luogu.org/problemnew/show/P109 ...
- gitweb
1. 简介 Gitweb提供了git版本库的图形化web浏览功能.可以到网站http://git.kernel.org/体验下效果,如下图所示. Gitweb界面 它既可以通过配置架设于web服务器上 ...
- 使用particles.js实现网页背景粒子特效
得知途径 B3log提供了两套博客系统,一个是用Java开发的,叫做Solo,我也是在网上搜索Java博客系统时发现了它,之后才了解了B3log:还有一个是用Go语言开发的,叫做Pipe.其中Solo ...
- react hooks 全面转换攻略(一) react本篇之useState,useEffect
useState 经典案例: import { useState } from 'react'; function Example() { const [count, setCount] = useS ...
- 略微讲讲最近的 webpack 该如何加快编译
首先假设 基础的环境是有 creat-react-app 所创建的 即所有基础的loader,插件的 cache 都已经缓存了 在这种情况下想加速,真是很难 不过,有一个插件是可以观察 各个模块所花的 ...