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

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

JPA(三):JPA+Hibernate 基础学习_第1张图片

      由以上图片我们可以得出两个结论:首先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则相当于Hibernatesession。不过在这里值得注意的是,关于EntityManager的获取分别有两种不同的方式。一种是@PersistenceContex注入;另一种则是 JNDI获得。

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

你可能感兴趣的:(JPA(三):JPA+Hibernate 基础学习)