`
mzhj
  • 浏览: 228113 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

04、第一个JPA实例与JPA主键生成策略

阅读更多
     写实体bean,映射的数据可以采用XML配置方式,也可以采用注解方式,在JPA中推荐大家用注解的方式,因为注解的方式开发应用效率是挺高的。

     每个实体bean都要有个实体标识属性,这个实体标识属性主要用于在内存里面判断对象。通过@Id就可以定义实体标识。可以标识在属性的get方法前面,也可以标识在字段上面,通常我们更倾向于标识在属性的get方面上面。
     如果我们希望采用数据库的id自增长的方式来生成主键值的话,这时候我们要用到一个注解@GeneratedValue,这注解里面有一些属性,其中一个是策略strategy,生成主键值的方案,JPA里没有Hibernate提供的那么多方案,它提供的方案有如下图:



 

 

 

 

  1.  
    • AUTO: JPA自动选择合适的策略,是默认选项;
    • IDENTITY: 采用数据库ID自增长的方式来生成主键值,Oracle不支持这种方式;
    • SEQUENCE: 通过序列产生主键,通过@SequenceGenerator注解指定序列名,MySql不支持这种方式;
    • TABLE: 采用表生成方式来生成主键值,那怎么样生成呢?很简单,表里面通常有两个字段,第一个字段是给它一个名称(就是个列名而已),第二个字段专门用来累加用的,就是说每访问一次这个表,第二个字段就会累加1,不断累加。就是说你们要得到这个主键值的话,访问这个表,然后update这个表的这个字段,把它累加1之后,然后再把这个值取出来作为主键,再给他赋进去,表生成就是这样。
    • Oracle数据库默认情况下,不能支持用id自增长方式来生成主键值;
    • mysql在默认情况下不能支持SEQUENCE序列的方式来生成主键值,所以我们一定要注意我们使用的数据库。
    • TABLE表生成方式才是通用的,但是这种方式效率并不高。
    • 如果我们开发的应用,我们不可以预测用户到底使用哪种数据库,那么这个时候应该设为哪个值呢?答案是AUTO,就是说由持久化实现产品,来根据你使用的方言来决定它采用的主键值的生成方式,到底是IDENTITY?还是SEQUENCE?还是TABLE? 如果用的是Hibernate,那么它会用IDENTITY这种生成方式来生成主键值。
  2.      

    IDENTITY和SEQUENCE这两种生成方案通不通用啊?对所有数据库:
              注意:如果我们把策略strategy设置成@GeneratedValue(strategy=GenerationType.AUTO)的话,AUTO本身就是策略的默认值,我们可以省略掉,就是说简单写成这样@GeneratedValue

    摘自CSDN:
         @GeneratedValue:主键的产生策略,通过strategy属性指定。默认情况下,JPA自动选择一个最适合底层数据库的主键生成策略,如SqlServer对应identity,MySql对应auto increment。在javax.persistence.GenerationType中定义了以下几种可供选择的策略:

    1) IDENTITY:采用数据库ID自增长的方式来自增主键字段,Oracle不支持这种方式;
    2) AUTO: JPA自动选择合适的策略,是默认选项;
    3) SEQUENCE:通过序列产生主键,通过@SequenceGenerator注解指定序列名,MySql不支持这种方式; 4) TABLE:通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使应用更易于数据库移植。不同的JPA实现商生成的表名是不同的,如 OpenJPA生成openjpa_sequence_table表Hibernate生成一个hibernate_sequences表,而 TopLink则生成sequence表。这些表都具有一个序列名和对应值两个字段,如SEQ_NAME和SEQ_COUNT。

    可参考http://blog.csdn.net/lzxvip/archive/2009/06/19/4282484.aspx



        实体bean开发完后,就要用持久化API对实体bean进行添删改查的操作,我们学习持久化API的时候,可以对照Hibernate来学习,接下来建立个单元测试,在开发的过程中,建议大家一定要用单元测试(junit可以用来进行单元测试)。

    第一步写:persistence.xml(要求放在类路径的META-INF目录下)
<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/persistence_1_0.xsd" version="1.0">

<persistence-unit name="itcast" transaction-type="RESOURCE_LOCAL">

   <properties>
    <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
    <property name="hibernate.hbm2ddl.auto" value="update"/>
    <property name="hibernate.connection.driver_class" value="org.gjt.mm.mysql.Driver" />
    <property name="hibernate.connection.username" value="root" />
    <property name="hibernate.connection.password" value="456" />
    <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/itcast?useUnicode=true&amp;characterEncoding=UTF-8" />
   </properties>

</persistence-unit>
</persistence>

 

第二步写:Person.java (实体bean)

 

package cn.itcast.bean;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;


@Entity          //以javax开头的包,都是Sun公司制定的一些规范
public class Person {
	private Integer id;
	private String name;

	public Person() {
	/*对象是由Hibernate为我们创建的,当我们通过ID来获取某个实体的时候,这个实体给我们返回了这个对象的创建是由Hibernate内部通过反射技术来创建的,反射的时候用到了默认的构造函数,所以这时候必须给它提供一个public的无参构造函数。*/
	}

	public Person(String name) {
		this.name = name;
	}

	@Id
	@GeneratedValue(strategy=GenerationType.AUTO) //auto默认,可不写,直接写@GeneratedValue
	public Integer getId() {
		return id;
	}

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

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}

 

第三步:PersonTest.java (junit单元测试)

 

 

package junit.test;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import org.junit.BeforeClass;
import org.junit.Test;

import cn.itcast.bean.Person;

public class PersonTest {

	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
	}

	@Test public void save(){
		//对实体bean进行操作,第一步应该获取什么对象啊?     SessionFactory对象
		//这里用获取的EntityManagerFactory对象,这可以把它看成跟Hibernate的SessionFactory对象差不多的东西
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast");
		//参数"itcast"是persistence.xml文件中<persistence-unit&nbsp;name="itcast">name的属性值。
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();	//开启事务
		em.persist(new Person("传智播客"));	//持久化对象
		em.getTransaction().commit();	//提交事务
		em.close();
		factory.close();

		//SessionFactory  -->  Session  -->  begin事务
	}
}

 


/*
session.save(obj);
    persist这方法在Hibernate里也存在,Hibernate的作者已经不太推荐大家用save方法,而是推荐大家用persist方法 。
    why? 首先并不是代码上的问题,主要是这个名字上的问题,因为我们把这个ORM技术叫做持久化产品,那么我们对某个对象持久化,应该叫持久化,而不应该叫保存,所以后来Hibernate的作者推荐用persist方法,这并不是功能的问题, 主要是取名的问题,所以用persist方法也可以 。
*/



    目前数据库表是不存在的,我们采取实体(领域)建模的思想,让它根据实体bean来生成数据库表,在persistence.xml里,<property name="hibernate.hbm2ddl.auto" value="update"/>,生成策略是update,就是说表不存在的时候,它会创建数据库表。 
    问题,它什么时候创建表啊?创建表的时机是在什么时候创建的啊?答案是得到SessionFactory的时候,在JPA里也一样,是我们得到EntityManagerFactory的时候创建表,也就是说我们只要执行下面的那段代码就生成表了。

 

public class PersonTest {

	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
	}

	@Test public void save(){		
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast");		
		factory.close();
	}

}

 


    通过这个特性,可以在开发的时候,用来验证我们编写的实体映射元数据是否是正确的,通过这个就可以判断。如果生成不了表,就说明是编写的实体映射出问题了(比如实体bean),以后要学会怎样排错。

 

 

 

  • 大小: 33 KB
分享到:
评论
1 楼 悲剧了 2011-04-21  
哥们总结的真好,有心了

相关推荐

    04_JPA详解_第一个JPA实例与JPA主键生成策略.zip

    本压缩包文件"04_JPA详解_第一个JPA实例与JPA主键生成策略.zip"包含了关于如何在实际项目中运用JPA,以及理解JPA主键生成策略的详细教程。 ### JPA基础 1. **JPA简介**: JPA是Java EE的一部分,它提供了一套规范,...

    04_传智播客JPA详解_第一个JPA实例与JPA主键生成策略

    【标题】"04_传智播客JPA详解_第一个JPA实例与JPA主键生成策略"涉及的关键知识点主要包括Java Persistence API (JPA)的基础应用、首个JPA实例的创建以及JPA主键生成策略的理解和配置。JPA是Java平台上的一个标准,...

    JPA详解视频教程 第4讲 第一个JPA实例与JPA主键生成策略.avi

    JPA用于整合现有的ORM技术,可以简化现有Java EE和Java SE应用对象持久化的开发工作,实现ORM的统一。JPA详解视频教程 第4讲 第一个JPA实例与JPA主键生成策略.avi

    传智播客JPA学习笔记.pdf

    第一个JPA实例与JPA主键生成策略** 在JPA中,主键的生成策略可以通过@Id注解和@GeneratedValue注解进行设置,如AUTO、IDENTITY、SEQUENCE、TABLE等,不同的策略对应不同的数据库系统主键生成方式。 **5. 日期_枚举...

    JPA搭建环境所需的jar包

    例如,@Entity表示一个Java类对应数据库中的一个表,@Id表示主键字段,@GeneratedValue则用于指定主键生成策略。 在搭建JPA环境时,我们需要以下几个关键的jar包: 1. **JPA API**:这是JPA规范的接口定义,通常...

    jpa学习总结,pdf类型的,详细介绍了jpa的应用

    第一个JPA实例 - **主键生成策略**:探讨如何在JPA中设置主键生成策略,如自增长(auto-increment)、序列(sequence)等。 - **实例演示**:通过一个简单的例子展示如何使用JPA进行基本的CRUD操作。 #### 8. 字段...

    java + spring boot +jpa 拦截器分库分表demo

    创建一个自定义的JPA拦截器,比如`ShardingInterceptor`,这个拦截器将在每个JPA的查询或保存操作之前/之后执行。在拦截器中,我们需要根据业务规则(例如:用户ID、订单号等)计算出目标库和表的索引,然后修改SQL...

    JPA入门(一)

    - **@GeneratedValue**: 控制主键生成策略。 - **@Column**: 映射字段到数据库列。 - **@OneToMany, @ManyToOne, @OneToOne, @ManyToMany**: 定义不同类型的关联关系。 **7. JPA事务管理** JPA支持声明式和编程式...

    jpa2.0jar包

    - "hibernate-JPA"可能是指Hibernate作为JPA的实现, Hibernate提供了丰富的功能,包括第一级缓存、第二级缓存、事务管理等,使得JPA的使用更加方便。 总之,JPA 2.0为Java开发者提供了强大且灵活的ORM解决方案,...

    Open JPA2 employee 简单例子

    在OpenJPA2中,创建一个简单的Employee实体类是第一步。实体类通常包含@Entity注解,表示该类将被JPA管理。例如: ```java import javax.persistence.Entity; import javax.persistence.GeneratedValue; import ...

    springboot-spring-data-jpa项目练习

    还需为实体属性添加`@Id`(主键)和`@GeneratedValue`(自动生成主键策略)等注解。 3. **Repository接口**:Spring Data JPA允许我们定义Repository接口,通过继承`JpaRepository`或`CrudRepository`,无需编写...

    JPA规范 1.0

    JPA 1.0是这个规范的第一个主要版本,它为开发者提供了一种统一的、声明式的方式来处理数据持久化,从而简化了企业级应用的开发过程。JPA的核心理念是对象关系映射(ORM),它允许开发者用面向对象的方式思考,而...

    JPA学习教程(多个文件)

    JPA支持多种主键策略,如自动生成、联合主键等。 - **持久化(Persistence)**: 将对象的状态存储到数据库的过程。JPA提供了几种不同的持久化方式,包括`EntityManager`的`persist()`方法、`merge()`方法和`detach...

    jpademo2.rar

    此外,@GeneratedValue注解用于指定主键生成策略。 3. **配置持久化单元** 配置持久化单元(Persistence Unit)是JPA的关键步骤。这通常在`persistence.xml`文件中完成,定义了数据源、JPA提供者、实体类等信息。...

    JPA所有例子

    - **实体类字段(Attributes)**: 实体类的字段对应表中的列,`@Id`注解标记主键,`@GeneratedValue`控制主键生成策略。 - **实体管理器(EntityManager)**: 是JPA的主要接口,负责实体的创建、查询、更新和删除...

    sample-jpa:JPA实用程序示例

    - JPA提供`@TableGenerator`和`@SequenceGenerator`等策略来生成主键,同时可以通过工具如Hibernate Tools进行数据库的反向工程,自动生成实体类。 通过"sample-jpa"项目,你可以实际操作这些概念,深入理解JPA的...

Global site tag (gtag.js) - Google Analytics