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

每个实体bean都要有个实体标识属性,这个实体标识属性主要用于在内存里面判断对象。通过@Id就可以定义实体标识。可以标识在属性的get方法前面,也可以标识在字段上面

如果我们希望采用数据库的id自增长的方式来生成主键值的话,这时候我们要用到一个注解@GeneratedValue,这注解里面有一些属性,其中一个是策略strategy,生成主键值的方案,JPA里没有Hibernate提供的那么多方案,它提供的方案有如下图:

  • AUTO: JPA自动选择合适的策略,是默认选项;
  • IDENTITY: 采用数据库ID自增长的方式来生成主键值,Oracle不支持这种方式;
  • SEQUENCE: 通过序列产生主键,通过@SequenceGenerator注解指定序列名,MySql不支持这种方式;
  • TABLE: 采用表生成方式来生成主键值,那怎么样生成呢?很简单,表里面通常有两个字段,第一个字段是给它一个名称(就是个列名而已),第二个字段专门用来累加用的,就是说每访问一次这个表,第二个字段就会累加1,不断累加。就是说你们要得到这个主键值的话,访问这个表,然后update这个表的这个字段,把它累加1之后,然后再把这个值取出来作为主键,再给他赋进去,表生成就是这样。TABLE表生成方式才是通用的,但是这种方式效率并不高。

Oracle数据库默认情况下,不能支持用id自增长方式来生成主键值;

mysql在默认情况下不能支持SEQUENCE序列的方式来生成主键值,所以我们一定要注意我们使用的数据库。

如果我们开发的应用,我们不可以预测用户到底使用哪种数据库,那么这个时候应该设为哪个值呢?答案是AUTO,就是说由持久化实现产品,来根据你使用的方言来决定它采用的主键值的生成方式,到底是IDENTITY?还是SEQUENCE?还是TABLE? 如果用的是mysql,那么它会用IDENTITY这种生成方式来生成主键值。

注意:如果我们把策略strategy设置成@GeneratedValue(strategy=GenerationType.AUTO)的话,AUTO本身就是策略的默认值,我们可以省略掉,就是说简单写成这样@GeneratedValue

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

第一步写:persistence.xml(要求放在类路径的META-INF目录下),具体参照前两节

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

 1 import javax.persistence.Column; 2 import javax.persistence.Entity; 3 import javax.persistence.GeneratedValue; 4 import javax.persistence.Id; 5      6 @Entity 7 public class Person { 8     @Id 9     @GeneratedValue10     private Integer id;11     @Column(length=10,nullable=false,name="personname")12     private String name;13     public Person(){}14     public Person(String name) {15         this.name = name;16     }17     public Integer getId() {18         return id;19     }20     public void setId(Integer id) {21         this.id = id;22     }23     public String getName() {24         return name;25     }26     public void setName(String name) {27         this.name = name;28     }29 }

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

 1 import javax.persistence.EntityManager; 2 import javax.persistence.EntityManagerFactory; 3 import javax.persistence.Persistence; 4  5 import org.junit.BeforeClass; 6 import org.junit.Test; 7  8 import com.jim.entity.Person; 9 10 public class PersonTest {11     @BeforeClass12     public static void setUpBeforeClass() throws Exception {13     }14     @Test15     public void save(){16         EntityManagerFactory factory=Persistence.createEntityManagerFactory("sample");//形如sessionFactory17         EntityManager em=factory.createEntityManager();18         em.getTransaction().begin();19         em.persist(new Person("jim"));20         em.getTransaction().commit();21         em.close();22         factory.close();23     }24 }

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

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

另外提一点,虽然JPA规范中暂时还没有UUID这种生成策略,但我们能使用Hibernate的注解来完成(虽然已经和Hibernate产生了耦合),代码如下所示:

1 @Entity2 3 public class Order {4     @Id
    @GenericGenerator(name="uuidpk",strategy="uuid")5     @GeneratedValue(generator="uuidpk")6     private String orderId;7         ……8 }

仅作参考

转载于:https://www.cnblogs.com/lich/archive/2011/11/29/2268253.html

JPA基础(四):第一个JPA实例与JPA主键生成策略相关推荐

  1. JPA实体注解与hibernate主键生成策略

    JPA实体注解与hibernate主键生成策略 用hibernate注解开发项目,对于主键的生成策略有些模糊,下面是从新浪网里面看到的一篇关于hibernate注解以及主键生成策略的文章,值得一看: ...

  2. jpa基于按annotation的hibernate主键生成策略

    JPA注解持久化类很方便,需要jar包:ejb3-persistence.jar下载 一.JPA通用策略生成器  通过annotation来映射hibernate实体的,基于annotation的hi ...

  3. jpa 根据主键生成策略获取id_JPA主键生成策略

    @GeneratedValue: 为一个实体类生成一个唯一标识的主键(JPA要求每一个实体Entity,必须有且只有一个主键).它有两个属性,分别是strategy和generator. genera ...

  4. JPA 配置UUID主键生成策略

    我们知道oracle 有一种主键生成策略是UUID, 用于生成一个不重复的字符串做为主键. 使用UUID 作为主键可以防止恶意猜测主键, 对数据做非法操作. Hibernate 对此也提供了支持, 会 ...

  5. JPA的主键生成策略

    数据的唯一性是很平常的要求,但是如果框架不能提供相关的控制而由程序员完全控制是很危险的,在JPA中,有下面四种策略. A.容器自动生成---GeneratorType.AUTO  由JPA自动生成 B ...

  6. jpa 根据主键生成策略获取id_如何在使用JPA和Hibernate时选择id生成策略

    MMTTMM 该API文档都对这个很清楚.所有生成器都实现了org.hibernate.id.IdentifierGenerator接口.这是一个非常简单的界面.一些应用程序可以选择提供自己的专用实现 ...

  7. jpa 生成uuid的主键_JPA注解主键生成策略-UUID

    @GeneratedValue:主键的产生策略,通过strategy属性指定. 主键产生策略通过GenerationType来指定.GenerationType是一个枚举,它定义了主键产生策略的类型. ...

  8. Jmeter Web 性能测试入门 (四):一个小实例带你学会 Jmeter 脚本编写

    测试场景: 模拟并发100个user,在TesterHome 站内搜索VV00CC 添加线程组 添加HTTP信息头管理器 添加HTTP Sampler 填写HTTP Sampler中的信息 添加监听器 ...

  9. 一个表对应另一个表中多个主键的查询方法(把一个表当成两个表用)

    表t_Record PID(主键)   SendUserID(发送人)   ReceiveUserID(接收人)    1              1                      2 ...

最新文章

  1. bidirectional pathtracing算法学习
  2. android tween动画效果
  3. excel如何匹配同名数据_Excel如何查找名字重复的数据
  4. 【MyBatis笔记】07-MyBatis 核心配置文件
  5. 哪些奇葩问题会让程序员抓狂?
  6. LINNAEUS:生物医学文献的物种名称识别系统
  7. 微信小程序中的换行、空格
  8. win10浏览器html设置字体大小设置,Win10网页字体变小了如何变大?网页字体变小了调节方法...
  9. MySQL中count是怎样执行的?———count(1),count(id),count(非索引列),count(二级索引列)的分析
  10. 对整个网页进行长截图
  11. AliOS-Things--EMW3060--linkkitapp
  12. 身份证号码验证——C语小程序言
  13. openCV 实现用 python 画线、画矩形、画圆、画椭圆、画多边形
  14. Ubuntu20.04 配置网卡信息
  15. AMD 硬解码开发(四)之边摸索边编译samples
  16. 除铜、除镍原装进口树脂CH-90
  17. zoom走了,谁的机会来了
  18. 钛备份 v7.4.0.2 安卓最新版
  19. mathtype公式在word中异常--显示异常--省略号异常
  20. vue el-select默认值

热门文章

  1. html响应式布局_媒体查询
  2. python day - 09 函数
  3. 2018-04-13web自动化学习心得(1)
  4. tomcat启动(五)Catalina分析-service.init
  5. web.py框架入门
  6. 主数据处理链碰到空数据节点不在继续执行的问题解决方案
  7. windows 2003 网络负载平衡设置实战
  8. 在 IIS6 配置使用php的fastcgi模式
  9. Node项目实战开发-博客系统
  10. border:0 none,border:none;,border:0;三者之间的区别