zoukankan      html  css  js  c++  java
  • Hibernate JPA

    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类型

  • 相关阅读:
    【线程间通信:代码示例:分析问题原因:修正代码】
    【死锁问题】
    【解决线程安全问题:通过Lock锁对象】
    【解决线程安全问题:同步方法】
    【解决线程安全问题:同步代码块】
    【线程实现的两种方式及区别】
    小阳的贝壳
    小石的妹子
    SPFA模板+dfs版检测负环
    逆序对模板
  • 原文地址:https://www.cnblogs.com/roxy/p/7646488.html
Copyright © 2011-2022 走看看