Spring学习---JPA配置和使用

时间:2022-09-23 00:26:19

  理论的东西如果不实践,永远不会变成自己的东西。本文将介绍用maven管理,用Hibernate作为JPA供应商,使用MYSQL数据库,配置和使用JPA。

  以下代码已经上传至GITHUB

  首先在pom.xml文件中添加依赖:

<dependencies>
<!-- 向pom添加必要依赖项 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>4.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency> <!-- 将Hibernate用作jpa提供程序 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.3.1.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.3.1.Final</version>
</dependency>
<!-- 使用mysql数据库,需要mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.31</version>
</dependency> </dependencies>

配置persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> <persistence-unit name="myJPA" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>com.domain.User</class>
<properties>
<!-- 配置Hibernate方言 -->
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
<!-- 配置数据库驱动 -->
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
<!-- 配置数据库用户名 -->
<property name="hibernate.connection.username" value="root" />
<!-- 配置数据库密码 -->
<property name="hibernate.connection.password" value="000" />
<!-- 配置数据库url -->
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/jpa?useUnicode=true&amp;characterEncoding=UTF-8" />
<!-- 设置外连接抓取树的最大深度 -->
<property name="hibernate.max_fetch_depth" value="3" />
<!-- 自动输出schema创建DDL语句 -->
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="javax.persistence.validation.mode" value="none"/>
</properties>
</persistence-unit> </persistence>

      注意该persistence.xml要放在META-INF目录下,persistence.xml是JPA配置的主要入口,当然后面在结合spring后,可以不用persistence.xml文件。

  JPA有两种事务模式:一种是RESOURCE_LOCAL,另外一种是JTA。关于事务,本人还不太了解,待我深入了解一番后,回来填坑Spring学习---JPA配置和使用

  JPA提供程序可以用不同的方法连接数据库。它可以使用一个javax.sql.DataSource实例,或者使用DriverManager直接打开连接。这里我使用的是第二种方法。如果连接用的是Hibernate管理,那么我们并不需要提供一个方言类,因为Hibernate会通过查看JDBC驱动程序类知道是哪个数据库,可以自己判断出使用寿命方言。但是如果使用的是DataSource,则必须提供方言类。

  <property name="hibernate.hbm2ddl.auto" value="update" /> 这句很重要,它允许Hibernate创建和更新数据库架构,对,没错,就是将数据库中的表重新建立或者更新。一般用在开发和测试阶段,在其他情况下,建议将value值设为none。

  接着我们来配置实体类:

/**
*
* <p>ClassName: Driver.java<p>
* <p>驾驶员实体类<p>
* @author linzj
* @createTime 2016年3月17日 上午10:07:57
*/
@Entity
@Table(name="driver")
public class Driver { @Id
@GeneratedValue
private Long id; @Column(name = "firstname")
private String firstName; @Column(name = "lastname")
private String lastName; @OneToMany(cascade=CascadeType.ALL)//传播性持久化
@JoinColumn(name = "dirver_id")
private Set<Car> cars = new HashSet<Car>(); public Long getId() {
return id;
} public void setId(Long id) {
this.id = id;
} public String getFirstName() {
return firstName;
} public void setFirstName(String firstName) {
this.firstName = firstName;
} public String getLastName() {
return lastName;
} public void setLastName(String lastName) {
this.lastName = lastName;
} public Set<Car> getCars() {
return cars;
} public void setCars(Set<Car> cars) {
this.cars = cars;
} @Override
public String toString() {
return "Driver [id=" + id + ", firstName=" + firstName + ", lastName="
+ lastName + ", cars=" + cars + "]";
} } /**
*
* <p>ClassName: Car.java<p>
* <p>汽车类<p>
* @author linzj
* @createTime 2016年3月17日 上午9:35:01
*/
@Entity
@Table(name="car")
public class Car { @Id
@GeneratedValue
private Long id; @Column(name = "name")
private String name; 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;
} @Override
public String toString() {
return "Car [id=" + id + ", name=" + name + "]";
} }

  上面注释了cascade=CascadeType.ALL为传播性持久化,顾名思义,就是在将一个Dirver对象持久化的同时,程序会同时给driver对象里的car对象也进行持久化。

创建测试类:

/**
* 创建实体管理工厂类,并测试工厂是否为开启状态
*/
@Test
public void openTest(){ EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("myJPA"); System.out.println("工厂类是否为开启状态:" + entityManagerFactory.isOpen()); } /**
* 创建实例,并进行持久化测试
*/
@Test
public void addTest(){ EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("myJPA"); // 创建实体管理对象
EntityManager entityManager = entityManagerFactory.createEntityManager(); // 创建一个新事务,记得开启事务
EntityTransaction entityTransaction = entityManager.getTransaction();
entityTransaction.begin(); // 创建一个Driver对象和两辆Car对象
Driver driver = new Driver();
driver.setFirstName("taylor");
driver.setLastName("swift"); Car carOne = new Car();
carOne.setName("BMW"); Car carTwo = new Car();
carTwo.setName("AUDI"); // 将car添加到driver集合中,并用EntityManager进行持久化
driver.getCars().add(carOne);
driver.getCars().add(carTwo); entityManager.persist(driver); // 提交事务,关闭EntityManager
entityTransaction.commit();
entityManager.close();
} /**
* 使用JPA查询实体
*/
@Test
public void findTest(){
EntityManagerFactory emf = Persistence.createEntityManagerFactory("myJPA");
EntityManager em = emf.createEntityManager();
EntityTransaction et = em.getTransaction();
et.begin();
Driver driver = em.find(Driver.class, 1L);
Car car = em.getReference(Car.class, 2L);
driver.setFirstName("justin");
em.remove(car);
et.commit();
em.close();
}

  JPA提供两种不同的查询方法,find()和getReference(),find方法将导致实体被获取并且立即返回,如果数据库中没有数据,则返回空值。getReference并不是直接访问数据库???再深入了解,getReference在数据库记录不存在时,将抛出异常。

  JPA的传播性持久化,在对于使用EntityManager实例加载的实体上所完成的操作,JPA会进行跟踪,被更改的实体将被标记为“脏数据”,该过程称为“自动脏数据检查”。在实体上完成的操作会导致更新语句,当开发人员提交事务时,JPA会执行这些更新语句。只要实体与EntityManager相连接,并且EntityManager保持打开状态,那么实体就会被跟踪。当关闭EntityManager时,加载的实体将会分离(实体处于游离状态),他们的状态更改不会被跟踪。此时需要一个新的EntityManager实例使用merge操作重新加载或者重新关联实体。

 

  以上就是JPA配置和使用的记录,下一篇记录下通过Spring使用JPA进行数据访问。

Spring学习---JPA配置和使用的更多相关文章

  1. 【转】Spring学习---Bean配置的三种方式(XML、注解、Java类)介绍与对比

    [原文]https://www.toutiao.com/i6594205115605844493/ Spring学习Bean配置的三种方式(XML.注解.Java类)介绍与对比 本文将详细介绍Spri ...

  2. Spring学习---JPA学习笔记

    用了一段时间的Spring,到现在也只是处于会用的状态,对于深入一点的东西都不太了解.所以决定开始深入学习Spring. 本文主要记录JPA学习.在学习JPA之前,需要了解一些ORM的概念. ORM概 ...

  3. Spring Data Jpa配置

    Spring Data JPA提供的接口,也是Spring Data JPA的核心概念: 1:Repository:最顶层的接口,是一个空的接口,目的是为了统一所有Repository的类型,且能让组 ...

  4. spring&plus;springMVC&plus;JPA配置详解&lpar;使用缓存框架ehcache&rpar;

    SpringMVC是越来越火,自己也弄一个Spring+SpringMVC+JPA的简单框架. 1.搭建环境. 1)下载Spring3.1.2的发布包:Hibernate4.1.7的发布包(没有使用h ...

  5. 【jpa】spring data jpa 配置使用

    1.spring data jpa 简单介绍 jpa是用于对象持久化的API,jpa是一种规范,而其他的ORM框架(hibernate,topLink等)是其实现,所以jpa可以使用不同的实现方式,修 ...

  6. 快速搭建springmvc&plus;spring data jpa工程

    一.前言 这里简单讲述一下如何快速使用springmvc和spring data jpa搭建后台开发工程,并提供了一个简单的demo作为参考. 二.创建maven工程 http://www.cnblo ...

  7. Spring与JPA

    Java持久化API(Java Persistence API),即JPA Spring中使用JPA的第一步是要在Spring应用上下文中将实体管理器工厂(entity manager factory ...

  8. Spring Data JPA之Hello World

    Spring Data Jpa 配置 使用 Spring Data JPA 进行持久层开发需要的四个步骤: 1.配置 Spring 整合 JPA 2.在 Spring 配置文件中配置 Spring D ...

  9. Spring Data JPA&colon; 实现自定义Repository

    一.前言 由于项目中的 实体(entity)默认都是继承一个父类(包含一些公共的属性,比如创建时间,修改时间,是否删除,主键id).为了实现逻辑删除,一般会自己实现RepositoryFactoryB ...

随机推荐

  1. 阿里提前批校招内推offer经历

    经过一个半月的阿里内推面试,今天终于收到了阿里的offer邮件 .阿里的内推面试一共有四轮,本人是7月19号投的内推邮件,8月28号收到了offer的邮件.首先本人谈谈内推的看法.内推是公司招聘人才的 ...

  2. BZOJ2426 &lbrack;HAOI2010&rsqb;工厂选址

    Description 某地区有m座煤矿,其中第i号矿每年产量为ai吨,现有火力发电厂一个,每年需用煤b吨,每年运行的固定费用(包括折旧费,不包括煤的运费)为h元,每吨原煤从第i号矿运到原有发电厂的运 ...

  3. VS2013 JS 跟踪

    VS2013JS  跟踪 1.在页面对应的cs文件中设置断点,F10单步执行. 2.单步执行调试会自然而然执行到JS里面.

  4. ldconfig及 LD&lowbar;LIBRARY&lowbar;PATH

    dconfig及 LD_LIBRARY_PATH 1. 往/lib和/usr/lib里面加东西,是不用修改/etc/ld.so.conf的,但是完了之后要调一下ldconfig,不然这个library ...

  5. HDU-1395 2&Hat;x mod n &equals; 1

    http://acm.hdu.edu.cn/showproblem.php?pid=1395 怎样取余是关键.. 2^x mod n = 1 Time Limit: 2000/1000 MS (Jav ...

  6. C&num;使用系统的&OpenCurlyDoubleQuote;显示桌面”功能&lpar;Shell&period;Application&rpar;

    原文 C#使用系统的“显示桌面”功能(Shell.Application) 在 Windows 系统的 任务栏 上的 快速启动栏 里,通常有一个图标  ,点击这个图标,就会切换到桌面.这个图标实际是一 ...

  7. 如何高效地向Redis插入大量的数据(转)

    最近有个哥们在群里问,有一个日志,里面存的是IP地址(一行一个),如何将这些IP快速导入到Redis中. 我刚开始的建议是Shell+redis客户端. 今天,查看Redis官档,发现文档的首页部分( ...

  8. Cocos发育Visual Studio下一个HttpClient开发环境设置

    Cocos2d-x 3.x相关类集成到网络通信libNetwork图书馆project于.这其中包括:HttpClient分类. 我们需要在Visual Studio溶液中加入libNetwork图书 ...

  9. c&num; int类型的转datetime类型

    int a =20190319; DateTime  b =  DateTime.ParseExact(a.tostring(),"yyyyMMdd",System.Globali ...

  10. 使用服务器参数文件(SPFILE)管理初始化参数

    传统上,Oracle数据库的初始化参数存储在文本初始化参数文件中.为了更好的可管理性,您可以选择在二进制服务器参数文件中维护初始化参数,该文件在数据库启动和关闭期间保持不变.本节介绍服务器参数文件,并 ...