导航

Hibernate JPA

Posted on 2017-10-10 16:43  耍流氓的兔兔  阅读(218)  评论(0编辑  收藏  举报

 

JPA:

JPA(Java持久层API):
  Java Persistence API
  由Java开发的持久化的标准,需要provider来实现其功能,Hbernate就是JPA Provider中很强的一个
  Hibernate时JPA标准的一个实现,还在此基础上增加了一些自己特有的功能(JPA是hibernate的一个子集的说法)
  
  如JDBC是Java数据库的通用API,每种数据库自己提供自己的实现
  如self4j是一种通用的日志API,用户选择不同的实现
  那么JPA是Java数据持久化的一个通用API,底层可以选择Hibernate,也可以选择TPLink等

易百教程:http://www.yiibai.com/jpa/jpa_architecture.html

Hibernate如何实现JPA: 

 Hibernate主要通过三个组件来实现:   

    hibernate-annotation:

      是Hibernate支持annotation方式配置的基础,它包括了标准的JPA annotation以及Hibernate自身特殊功能的annotation

    hibernate-core:

      是Hibernate的核心实现,提供了Hibernate所有的核心功能

    hibernate-entitymanager:

      实现了标准的API,可以看作hibernate-core和JPA之间的适配器

      它并不直接提供ORM的功能,而是对hibernate-core进行封装,使得Hibernate符合JPA的规范

  pojo: 

  在Hibernate JPA中,不需要创建JavaBean.hbm.xml文件,可以使用javax.persistence注解代替

//相当于创建了Customer.hbm.xml
@Entity
@Table(name="t_customer1")
public class Customer {

    @Id
    //主键生成策略
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="c_id")
    private Integer id;
    
    @Column(name="c_name")
    private String name;
    
    @Column(name="c_gender")
    private Character gender;
    
    //数据库忽略此属性
    @Transient
    private Integer age;
    
    @Column(name="c_level")
    private String level;

  hibernate.cfg.xml:

   <!-- mapping文件 -->
   <mapping class="com.roxy.hibernate.pojo.Customer"/>

  Test:

    @Test
    public void testJPA(){
    
        Session session = HibernateUtil.openSession();
        Transaction tx = session.beginTransaction();
        
        Customer c = new Customer();
        c.setName("hormoine");
        
        session.save(c);
        
        tx.commit();
        session.close();
        
    }

 Hibernate主键生成策略和JPA主键生成策略对比:

  hibernate内置了很多主键生成策略,这些策略可以分为两类:JPA标准的主键生成策略和Hibernate框架特有的主键生成策略

  Hibernate:

    Identity:提供对自增主键的支持(mysql、sqlserver)
    sequence:利用数据库的序列生成的能力生成主键字段(oracle)
    native:本地策略,由hibernate自动根据不同的数据库选择

    uuid:生成32位的16进制字符串走位主键
    increment:生成递进的数值类型(+1)

    assigned:由开发者明确赋值

  JPA:

@GeneratedValue(strategy=GenerationType.IDENTITY)   

提供对自增主键的支持,对应hibernate的identity

@GeneratedValue(strategy=GenerationType.AUTO)    

是JPA默认的策略
将主键生成的策略交给持久化引擎(persistence engine)来决定,从table策略、sequence策略、identity策略中选择最合适的

  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="mySeqGenerator")
  @SequenceGenerator(name = "mySeqGenerator",
    sequenceName = "t_customer2_sequence",
    initialValue = 1000, allocationSize = 50)
   
  使用数据库内置的序列生成器,对应hibernate的sequence策略

  可以配合使用@SequenceGenerator,用来指定序列的相关信息

    name:序列生成器的名称,会在@GeneratedValue中进行引用

    sequenceName:oracle数据库中的序列生成器名称

    initialValue:主键的初始值

    allocationSize:主键每次增长值的大小 

注意:如果底层数据库不执行序列,会报错:

org.hibernate.MappingException: org.hibernate.dialect.MySQLDialect does not support sequences

    @GeneratedValue(strategy = GenerationType.TABLE, generator="myTableGenerator")
    @TableGenerator(name = "myTableGenerator",
        table = "t_customer3_table",
        pkColumnName = "pk_key",
        valueColumnName = "pk_value",
        pkColumnValue = "teacherId",
        initialValue = 100,
        allocationSize = 1000)

  使用一张特殊的数据库表,保存插入记录时需要的主键值

  @GenericGenerator(name="system-uuid", strategy="uuid")
  @GeneratedValue(generator="system-uuid")

  如果使用hibernate对JPA的实现,可以使用Hibernate对主键生成策略进行扩展,通过@GenericGenerator实现
  使用此方法,主键必须为String类型