JPA(三):JPA+Hibernate 基础学习

在该系列的第一篇文章中,我们已经提到JPA和Hibernate。下图是两者在系统架构中的作用:

由以上图片我们可以得出两个结论:首先JPA的主要作用就是持久化操作;其次JPA只是一种规范,它需要一种实现,正如上图显示的,Hibernate、oPenJPA等等。简单些,可以说JPA只是一套接口,本身不能完成任何事情。

而这篇博文的主要内容就是对JPA和Hibernate学习的一个总结。首先来看一个最简单的入门demo。

所需jar包:

hibernate3.jar

hibernate-cglib-repack-2.1_3.jar

slf4j-api-1.5.2.jar

javassist-3.4.GA.jar

jta-1.1.jar

antlr-2.7.6.jar

commons-collections-3.1.jar

dom4j-1.6.1.jar

ejb3-persistence.jar

hibernate-annotations.jar

hibernate-commons-annotations.jar

hibernate-entitymanager.jar

log4j.jar

slf4j-log4j12.jar


创建实体类:

/***********************************************************************
 * 模块:  BuildType.java
 * 作者:  Jones
 * 说明:  Defines the Class BuildType
 * 日期:  2014年12月2日 20:56:11
 ***********************************************************************/

package com.tgb.itoo.basic.entity;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.codehaus.jackson.annotate.JsonIgnore;
import org.hibernate.annotations.GenericGenerator;

/**
 * 建筑类型
 */
@Entity
@Table(name = "TB_BuildType")  //默认情况下表名称是根据实体类名称创建的,name可以修改表名称
public class BuildType extends EntityDelete{

	@Id
    @GenericGenerator(name = "uuidGenerator", strategy = "com.tgb.itoo.base.util.uuid.Base58UuidGenerator")
    @GeneratedValue(generator = "uuidGenerator")
    @Column(name = "id", length = 22)
    private String id;

	/**
	 * 类型代码
	 *
	 */
	@Column(name = "buildTypeCode", length = 255)
	private String buildTypeCode;
	/**
	 * 类型名称
	 */
	@Column(name = "buildTypeName", length = 255)
	private String buildTypeName;

	/**
	 * 建筑类型中有的建筑信息
	 */
	@JsonIgnore
	@OneToMany(cascade = CascadeType.ALL, mappedBy = "buildType", targetEntity = Build.class)
	private Set<Build> builds = new HashSet<Build>();

	//*************************get/set方法*******************************//

	/**
	 * 建筑类型中有的建筑信息
	 */
	public Set<Build> getBuilds() {
		return builds;
	}

	/**
	 * 建筑类型中有的建筑信息
	 */
	public void setBuilds(Set<Build> builds) {
		this.builds = builds;
	}

	/**
	 * 类型代码
	 */
	public String getBuildTypeCode() {
		return buildTypeCode;
	}

	/**
	 * 类型代码
	 */
	public void setBuildTypeCode(String buildTypeCode) {
		this.buildTypeCode = buildTypeCode;
	}

	/**
	 * 类型名称
	 */
	public String getBuildTypeName() {
		return buildTypeName;
	}

	/**
	 * 类型名称
	 */
	public void setBuildTypeName(String buildTypeName) {
		this.buildTypeName = buildTypeName;
	}
	/**
	 * 主键id
	 */
	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}
}

其中主键生成策略@GeneratedValue(strategy=GenerationType.AUTO)中:

(1)值为AUTO表示根据数据库由Hibernate自动选择生成策略,也可以省略写@GeneratedValue

(2)值为IDENTITY表示主键自增长

(3)值为SEQUENCE表示主键采用序列的方式

(4)值为TABLE各个数据库都通用,但效率较低

创建完实体类之后,就需要写JPA的配置文件了。JPA规范要求配置文件在类路径的META-INF目录下放置名称为固定的的,即persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence 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_1_0.xsd" version="1.0">

    <!-- 持久化单元,transaction-type事务类型包括全局事务类型JTA和本地事务类型 RESOURCE_LOCAL-->
	<persistence-unit name="basic-entity" transaction-type="JTA">

		<provider>org.hibernate.ejb.HibernatePersistence</provider>

   		<jta-data-source>java:jboss/datasources/JcMysqlDS</jta-data-source>   		

  		<properties>
  		<!-- 数据库方言 -->
  		 <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
			<property name="hibernate.hbm2ddl.auto" value="update" />
			<property name="hibernate.show_sql" value="true" />

  		</properties>
	</persistence-unit>

</persistence>

其中,<property name="hibernate.hbm2ddl.auto" value="update" />表示建表方式,value值为creat-drop时表示创建应用的时候建表,结束应用的时候表自动删除;值为update表示如果映射元数据不存在则建立表,如果映射元数据存在并新增加了字段则会添加到数据库表中。


测试类:

public class PersonTest {

    @BeforeClass

    public static void setUpBeforeClass() throws Exception {

    }

     @Test

    public void save(){

         //Persistence.createEntityManagerFactory("jpa")与配置文件中的持久化单元名称必须相同

        EntityManagerFactory factory = Persistence.createEntityManagerFactory("jpa");

        EntityManager em = factory.createEntityManager();

        em.getTransaction().begin();

        //保存(持久化)方法

        em.persist(new Person("Tom"));

        em.getTransaction().commit();

        em.close();

        factory.close();

    }

}

其中EntityManagerFactory相当于Hibernate中的sessionFactory,EntityManager则相当于Hibernate中session。不过在这里值得注意的是,关于EntityManager的获取分别有两种不同的方式。一种是@PersistenceContex注入;另一种则是
JNDI获得。

这样一个简单的JPA+Hibernate就可以执行数据库持久化操作了。你明白了?

时间: 2024-08-05 18:03:10

JPA(三):JPA+Hibernate 基础学习的相关文章

Hibernate基础学习(一)&mdash;初识Hibernate

一.对象的持久化 狭义的理解: 持久化仅仅指把对象永久的保存到数据库中. 广义的理解: 持久化包括和数据库相关的各种操作.         保存: 把对象永久保存到数据库中.         更新: 更新数据库中对象的状态.         删除: 从数据库中删除一个对象.         查询: 根据特定的查询条件,把符合查询条件的一个或者多个对象加载到内存中.   二.ORM      ORM(Object-Relation-Mapping),对象关系映射.      ORM的思想: 将关系

第三周----html基础学习

主要是记录自己从基础开始扎实学习html的过程,这周是第一周,下面是我实现的几个实例,主要还是比较基础的东西通过整理一遍的方式来巩固一下自己 首先就是超链接 <a href="熨斗林佳鹏.html" target="_blank">灿坤蒸汽电熨斗</a> 这样就可以通过点击这句话跳转到另外一个html,target属性则可以让这个被链接的东西在何处显示 然后是多层次显示,通过不同的标题实现 <!DOCTYPE html> <

Hibernate基础学习(四)&mdash;对象-关系映射(上)

一.映射对象标识符      Java语言按内存地址来识别或区分同一个类的不同对象,而关系数据库按主键值来识别或区分同一个表的不同记录.Hibernate使用对象标识符(OID)来建立内存中的对象和数据库表中的记录的对应关系,对象的OID和数据库表的主键对应,为了保证OID的唯一性和不可变性,应该让Hibernate,而不是应用程序来为OID赋值.     Hibernate推荐在数据表中使用代理主键,即不具备业务含义的字段.代理主键通常为整型,因为整型比字符串要节省更多数据库空间.     在

hibernate基础学习---hierbnate2级缓存

1:开启二级缓存sessionFactory需要安装jar包 2:在实体类配置文件添加(配置二级缓存).我的配置文件是Account.hbm.xml <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapp

Hibernate基础学习(二)&mdash;Hibernate相关API介绍

一.Hibernate的核心接口      所有的Hibernate应用中都会访问Hibernate的5个核心接口.      (1)Configuration接口: 配置Hibernate,启动Hibernate,创建SessionFactory对象.      (2)SessionFactory接口: 初始化Hibernate,创建Session.      (3)Session接口: 负责保存.更新.删除.加载和查询对象.      (4)Transaction接口: 管理事务.     

Hibernate基础学习(六)&mdash;Hibernate二级缓存

一.概述      Session的缓存是一块内存空间,在这个内存空间存放了相互关联的Java对象,这个位于Session缓存内的对象也被称为持久化对象,Session负责根据持久化对象的状态来同步更新数据库.      Session的缓存是内置的,不能被拆卸,也被称为Hibernate的第一级缓存.此外,SessionFactory有一个内置缓存和一个外置缓存,内置缓存不能被拆卸,而外置缓存是可插拔的缓存插件,也被称为Hibernate的第二级缓存,第二级的缓存本身实现很复杂,必须实现并发访

Hibernate基础学习2

0)测试hibernate的一级缓存,事务以及查询语句 1)Hibernate的一些相关概念 hibernate的一级缓存 1)缓存是为了提高该框架对数据库的查询速度 2)一级缓存是将获取的结果放到了session中,再次查询直接从缓存中获取(提高查询效率) 3)缓存进阶之快照:将获取的一份结果放到session中,一份放到快照中,当修改时,对比快照与缓存, 如果数据没有发生变化,直接结束修改(避免不必要的修改) hibernate的事务 在业务开始之前打开事务,在业务结束时提交事务,如果出现异

Python自动化开发学习的第三周---python基础学习

本周内容 1.函数的基本语法和特性 2.参数与局部变量 3.返回值 4.递归函数 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 ---------分割线------------ 1.函数的基本语法和特性 函数是什么? 定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可 特性: 减少重复代码 使程序变的可扩展 使程序变得易维护 语法定义 1 def sayhi():#函数名 2 print("Hello, I'm nobody!&

[ SSH框架 ] Hibernate框架学习之四(JPA)

一.JPA概述以及它和Hibernate之间的关系 1.1.Hibernate 概述 JPA Java Persistence API,是EJB3规范中负责对象持久化的应用程序编程接口(ORM接口),它定义一系列的注释.这些注释大体可分为:类级别注释.方法级别注释.字段级别注释.给实体类添加适当的注释可以在程序运行时告诉Hibernate如何将一个实体类保存到数据库中以及如何将数据以对象的形式从数据库中读取出来. 目前有两种注释方案可以确定对象与表格之间的对应关系:一种是注释实体类的属性字段(字