读书人

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

发布时间: 2012-10-08 19:54:56 作者: rapoo

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

?

?

?

?

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

    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目录下)

?

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

?

????问题,它什么时候创建表啊?创建表的时机是在什么时候创建的啊?答案是得到SessionFactory的时候,在JPA里也一样,是我们得到EntityManagerFactory的时候创建表,也就是说我们只要执行下面的那段代码就生成表了。

?

  

读书人网 >软件架构设计

热点推荐