JPA

Sun官方提出的Java持久化规范。它为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据。他的出现主要是为了简化现有的持久化开发工作和整合ORM技术,结束现在Hibernate、TopLink等ORM框架各自为营的局面。值得注意的是,JPA是在充分吸收了现有Hibernate、TopLink等ORM框架的基础上发展而来的,具有易于使用、伸缩性强等优点

  • 简化现有Java EE和Java SE应用的对象持久化的开发工作
  • Sun希望整合ORM技术,实现一统江湖。

JPA不是一种新的ORM框架,他的出现只是用于规范现有的ORM技术,他不能取代现有的Hibernate、TopLink等ORM框架。相反,在采用JPA开发时,我们仍将使用到这些ORM框架,只是此时开发出来的应用不再依赖于某个持久化提供商。应用可以在不修改代码的情况下在任何JPA环境下运行,真正做到低耦合,可扩展的程序设计。

User

package com.jege.jpa.single.table;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table; /**
* @author JE哥
* @email 1272434821@qq.com
* @description:单表
*/
@Entity
@Table(name = "t_user")
public class User {
@Id
@GeneratedValue
private Long id;
private String name;
private Integer age; public User() { } public User(String name, Integer age) {
this.name = name;
this.age = age;
} public Long getId() {
return id;
} public void setId(Long id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} @Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
} }

SingleTableTest

package com.jege.jpa.single.table;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence; import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test; /**
* @author JE哥
* @email 1272434821@qq.com
* @description:单表CRUD Test
*/
public class SingleTableTest {
private static EntityManagerFactory entityManagerFactory = null;
private EntityManager entityManager = null; @BeforeClass
public static void setUpBeforeClass() throws Exception {
entityManagerFactory = Persistence.createEntityManagerFactory("com.jege.jpa");
} @Before
public void persist() throws Exception {
entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin(); User user = new User("je-ge", 22); System.out.println("保存之前:" + user);
entityManager.persist(user);// JPA会自动把保存后的主键放到当前对象的id里面
System.out.println("保存之后:" + user);
System.out.println("+++++++++++++++");
} @Test
public void modify() throws Exception {
User user = entityManager.find(User.class, 1L);
System.out.println("修改前:" + user);
user.setName("JE-GE");
user.setAge(18);
entityManager.merge(user);
user = entityManager.find(User.class, 1L);
System.out.println("修改后:" + user);
} @Test
public void find() throws Exception {
User user = entityManager.find(User.class, 1L);
System.out.println(user);
} @Test
public void remove() throws Exception {
User user = entityManager.find(User.class, 1L);
System.out.println("删除前:" + user);
entityManager.remove(user);
user = entityManager.find(User.class, 1L);
System.out.println("删除后:" + user);
} @After
public void tearDown() throws Exception {
entityManager.getTransaction().commit();
if (entityManager != null && entityManager.isOpen())
entityManager.close();
} @AfterClass
public static void tearDownAfterClass() throws Exception {
if (entityManagerFactory != null && entityManagerFactory.isOpen())
entityManagerFactory.close();
} }

核心API

Persistence

  • 主要用于创建EntityManagerFactory,根据传入的Persistence Unit名称来创建对应的EntityManagerFactory。

EntityManagerFactory

  • EntityManagerFactory中应保存了对应的persistence unit中的数据库配置信息和所有实体及关系以及预定义的JPQL语句。同时,EntityManagerFactory还负责维护二级缓存。
  • EntityManagerFactory对象的创建会有较大的开销,而且EntityManagerFactory对象采取了线程安全的设计方式,因此在实际中EntityManagerFactory对象可以尽量的共享,在大多数情况下,一个应用中针对一个数据库可以共享一个EntityManagerFactory实例。

EntityManager

  • 使用最广泛,类似于Hibernate的Session对象。
  • 它提供和持久化相关的操作。增、删、改、查等。并不是线程安全的,故一个EntityManager对象只可以由一个线程使用,并且避免多个线程共享。
  • 不过是轻量级的,创建和销毁不需要消耗太多资源。EntityManager中也有类似Hibernate Session的一级缓存。

JPA中的注解

  • @Entity:将领域对象标注为一个实体,默认情况下类名为表名,通过@Table(name = “t_user”)可以重新指定。
  • @Id:属性对应的表的主键。
  • @GeneratedValue:主键产生策略,通过startage属性指定。
  • @Column:属性对应的表字段。

其他关联项目

源码地址

https://github.com/je-ge/jpa

如果觉得我的文章对您有帮助,请打赏支持。您的支持将鼓励我继续创作!谢谢!



JPA 系列教程2-单表操作的更多相关文章

  1. JPA 系列教程17-继承-独立表-TABLE_PER_CLASS

    PerTable策略 每个具体的类一个表的策略 举例 这种映射策略每个类都会映射成一个单独的表,类的所有属性,包括继承的属性都会映射成表的列. 这种映射策略的缺点是:对多态关系的支持有限,当查询涉及到 ...

  2. JPA 系列教程10-双向一对一关联表

    双向一对一关联表的ddl语句 CREATE TABLE `t_person` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(255 ...

  3. django系列5.2--ORM数据库的单表操作

    单表操作 在views.py中添加对数据库的操作语句 #在逻辑代码中导入你要操作的表 from app import models def add_book(request): ''' 添加表记录 : ...

  4. Django系列(三):单表操作

    1.ORM简介 MTV或者MTV框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人 ...

  5. JPA 系列教程7-双向多对多

    双向多对多的ddl语句 同单向多对多表的ddl语句一致 Student package com.jege.jpa.many2many; import java.util.HashSet; import ...

  6. JPA 系列教程16-继承-联合子类-JOINED

    联合子类策略 这种情况下子类的字段被映射到各自的表中,这些字段包括父类中的字段,并执行一个join操作来实例化子类. 举例 如果实体类Teacher继承实体类Person,实体类Student也继承自 ...

  7. JPA 系列教程4-单向一对多

    JPA中的@OneToMany @Target({METHOD, FIELD}) @Retention(RUNTIME) public @interface OneToMany { Class tar ...

  8. JPA 系列教程3-单向多对一

    JPA中的@ManyToOne 主要属性 - name(必需): 设定"many"方所包含的"one"方所对应的持久化类的属性名 - column(可选): 设 ...

  9. JPA 系列教程21-JPA2.0-@MapKeyColumn

    @MapKeyColumn 用@JoinColumn注解和@MapKeyColumn处理一对多关系 ddl语句 CREATE TABLE `t_employee` ( `id` bigint(20) ...

随机推荐

  1. img 鼠标滑上后图片放大,滑下后图片复原

    <style type="text/css">img{ -webkit-transition: ease .2s; transition: ease .2s; -web ...

  2. AnimatorController动画融合树

    通过Unity动画状态机,能帮我们轻松处理转换各个动画片断,达到想要的效果,但是如果仅仅是一个个动画的硬生生的切换,那么看起来就非常突然,而不真实了,在质量要求比较高的游戏中,特别是动作游戏,我们就不 ...

  3. Objetive-C +load方法研究

    load方法的执行时机           Objetive-C 的runtime会在一个类的所有方法加载到内存中时调用这个类的+load() 方法,因为每个类的方法只是加载一次,所以每个+load( ...

  4. Struts文件上传

    首先要加入上传文件需要的jar文件 commons-fileupload-1.2.1.jar commomons-io-1.3.2.jar不同版本的strutsjar文件的版本也可能不同,一般在配置s ...

  5. 带密钥的sha1加密

    带密钥的sha1加密: private static string HmacSha1Sign(string jsonStr, string secretKey, string enCoding ) { ...

  6. 我使用的Bash脚本模板

    在Linux环境下(包括在相应的模拟环境,如Windows中的Cygwin)工作的时间久了,就会慢慢积累出一些自己写的小脚本程序,用于加速日常的操作与工作流程,如自动挂载与卸载U盘,映射网络驱动器,数 ...

  7. 【卷一】正则一 之re.split

    有时候,用re.split()匹配字符串会比findall,search, match等 正则表达式对象方法方便简洁很多! 参考: <Python核心编程(3rd)>—p23 如果给定分隔 ...

  8. windows xp sp3 下载地址

      windows xp service pack 3/ windows xp sp3 简体中文版下载地址: http://download.windowsupdate.com/msdownload/ ...

  9. Webdriver控制翻页控件,并实现向前向后翻页功能,附上代码,仅供参考,其他类似日期控件的功能可以自己封装

    新增输入与选择页面的html源码: <div style="margin-top:-60px;" class="modal-content" id=&qu ...

  10. span设置宽和高当没有内容的时候也可以撑开

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...