zoukankan      html  css  js  c++  java
  • JPA API与注解

    一、JPA API

    • Persistence 类:用于获取 EntityManagerFactory 实例,该类含有静态方法 createEntityManagerFactory
    //persistence.xml 中的 persistence-unit
    String persistenceUnitName = "jpa-1";
    EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory(persistenceUnitName);
    

    还可以使用 map 来配置 hibernate。

    Map map = new HashMap<String, Object>();
    map.put("hibernate.show_sql", false);
    EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory(persistenceUnitName, map);
    
    • EntityManagerFactory 接口:创建 EntityManager 实例,该接口有以下几个方法:

      • createEntityManager():用于创建实体管理对象实例。
      • isOpen():检查 EntityManagerFactory 是否处于打开的状态。默认创建后就一直是打开的,除非调用close() 方法将其关闭。
      • close():关闭 EntityManagerFactory, EntityManagerFactory 关闭后将释放所有资源,其他方法将不能调用,否则将导致 IllegalStateException 异常。
    • EntityManager 类:该类是完成持久化操作的核心对象,实体作为普通的 Java 对象,只有在调用 EntityManager 将其持久化后才会变成持久化对象。它有以下几个方法:

      • find(Class entityClass,Object primaryKey):返回指定的 OID 对应的实体类对象。

        //若 OID 不存在于数据库中,则会返回一个 null
        Customer c = entityManager.find(Customer.class, 2);
        
      • getReference (Class entityClass,Object primaryKey):与 find 方法类似,但是采用懒加载的方式,并且如果数据库中不存在此 OID,会抛出 EntityNotFoundException。

        //若 OID 不存在于数据库中,则会抛出 EntityNotFoundException 异常
        Customer c = entityManager.getReference(Customer.class, 2);
        // 由于懒加载,此行结果会先于 SQL 语句显示出来
        System.out.println("-------");
        System.out.println(c.getLastName());
        
      • persist(Object entity):用于将新创建的 Entity 从新建状态转为持久化状态即插入数据,也能更新数据。

        Customer customer = new Customer();
        customer.setAge(15);
        customer.setLastName("Tom");
        customer.setEmail("Tom@163.com");
        
        entityManager.persist(customer);
        
        Customer customer = entityManager.find(Customer.class, 1);
        customer.setLastName("Tom");
        entityManager.persist(customer);
        
      • remove(Object entity):将实体的状态从持久化状态变为删除状态,并从数据库中删除相应的记录。

        //实体不能是游离态的,否则会抛出异常,例如以下就是不行的
        // Customer c = new Customer();
        // c.setId(2);
        // entityManager.remove(c);
        Customer customer = entityManager.find(Customer.class, 2);
        entityManager.remove(customer);
        
      • merge(T entity):用于处理 Entity 的同步。即数据库的插入和更新操作。

      此外 EntityManager 还有一些其他的方法,实际用到了再查阅吧。

    • EntityTransaction:事务管理类,有以下一些方法:

      • begin():启动一个事务
      • commit():提交一个事务
      • rollback():回滚一个事务。
      • isActive():查看当前事务是否是活动的,若为 true,则不能调用 begin()开启事务。

    扩:实体的状态

    • 新建状态:新创建的对象,尚未拥有持久化主键。
    • 持久化状态:有持久化主键并和持久化建立了上下文环境。
    • 游离状态:有持久化主键,但是没有和持久化建立上下文环境。
    • 删除状态:拥有持久化的主键并和持久化建立了上下文环境,但是已从数据库中删除。

    注:在这里,建立上下文环境就是与 EntityManager 关联。

    二、JPA 注解

    下面就来介绍些 JPA 中常见的注解。

    • @Entity 注解:用于实体类声明语句之前,指出该 Java 类为实体类,并映射到指定的数据库表中。

      @Entity(name = "customers") // 将 Customer 类 映射到 cutomers 表中
      public class Customer {
      
    • @Basic 注解:表示实体类中的属性到数据表中字段的映射,对于没有任何标注的 getXxx()方法,默认就是@Basic。

      // 默认情况下,就是@Basic 注解,email 属性映射成表中的 email字段
      public String getEmail() {
          return email;
      }
      
    • @Column 注解:指定属性映射成表中的特定名字字段,即属性和表中字段不同名。

      //将lastName 映射成表中的 last_name 字段
      @Column(name = "last_name")
      public String getLastName() {
          return lastName;
      }
      
    • @Id 注解:用于将此属性映射成数据表中的主键列。该注解往往也和 @GeneratedValue 注解一起使用,用于标注生成主键的策略。

      // 表示 id 属性映射成数据表中的主键列,并使用自动递增的生成策略
      @Id
      @GeneratedValue(strategy = GenerationType.IDENTITY)
      public Integer getId() {
          return id;
      }
      
    • @Transient 注解:表示该属性不映射数据表中的字段。若某个属性不是数据表中的字段,则必须加上此注解,因为 ORM 框架默认属性的注解为 @Basic。

    • @Temporal 注解:在核心的 Java API 中日期、时间的类型都是 Date,而在数据库中却有DATE,TIME TIMESTAMP 或者混用,所以若要精确日期或时间,就需要使用此注解。

      //映射到数据库中的birth字段形如 2018-06-02,不加该注解,表中字段形如2018-06-02 12:22:12
      @Temporal(TemporalType.DATE)
      public Date getBirth() {
          return birth;
      }
      
  • 相关阅读:
    Java实现无向图的欧拉回路判断问题
    Java实现无向图的欧拉回路判断问题
    Java实现无向图的欧拉回路判断问题
    Java实现无向图的欧拉回路判断问题
    Java实现无向图的欧拉回路判断问题
    _stricmp, _wcsicmp, _mbsicmp, _stricmp_l, _wcsicmp_l, _mbsicmp_l 比较函数
    ring3下利用WMI监视进程创建(vc版)
    更改当前电源策略(使用SetActivePwrScheme API函数),自定义电源按钮动作(设置GLOBAL_POWER_POLICY)
    zyltimer与ZylIdleTimer
    QtCreator源码分析—2.启动主程序(4篇)
  • 原文地址:https://www.cnblogs.com/yunche/p/10292114.html
Copyright © 2011-2022 走看看