程序员人生 网站导航

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

栏目:数据库应用时间:2015-05-12 09:01:38

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


      由以上图片我们可以得出两个结论:首先JPA的主要作用就是持久化操作;其次JPA只是1种规范,它需要1种实现,正如上图显示的,Hibernate、oPenJPA等等。简单些,可以说JPA只是1套接口,本身不能完成任何事情。      
      而这篇博文的主要内容就是对JPA和Hibernate学习的1个总结。首先来看1个最简单的入门demo。

      所需jar包:

     hibernate3.jar

     hibernate-cglib-repack⑵.1_3.jar

     slf4j-api⑴.5.2.jar

     javassist⑶.4.GA.jar

     jta⑴.1.jar

     antlr⑵.7.6.jar

     commons-collections⑶.1.jar

     dom4j⑴.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⑻"?> <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的获得分别有两种不同的方式。1种是@PersistenceContex注入;另外一种则是 JNDI取得。

     这样1个简单的JPA+Hibernate就能够履行数据库持久化操作了。你明白了?

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐