zoukankan      html  css  js  c++  java
  • JPA 入门程序及相关注解

    1. 概述

    • JPA(Java Persistence API):用于对象持久化的API;
    • JPA本质上是一种ORM规范,不是ORM框架;提供了一些编程的API接口;
    • Hibernate是实现;

    1.1 JPA 包括三方面的技术

    • ORM映射元数据:JPA支持XML和JDK5.0注解两种元数据的形式;
    • JPA的API:用于操作实体对象,执行CRUD操作;
    • 查询语言(JPQL)

    2. Hello World

    • 创建persistence.xml,配置持久化单元
      • 指定跟哪个数据库进行交互;
      • 指定JPA使用哪个持久化框架以及配置该框架的基本属性;
    • 创建实体类,使用注解来描述实体类与数据库表之间的映射关系;
    • 使用JPA API完成数据增删改查
      • 创建EntityManagerFactory(对应Hibernate中的SessionFactory);
      • 创建EntityManager(对应Hibernate中的Session)

    2.1 使用Eclipse,创建JPA工程

    2.2 导入所需JAR包

    2.3 配置persistence.xml文件

    <persistence-unit name="jpa001" transaction-type="RESOURCE_LOCAL">
        <!-- 配置使用什么ORM产品来作为 JPA 的实现 -->
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    
        <!-- 添加持久化类 -->
        <class>com.noodles.jpa.helloworld.Customer</class>
    
        <properties>
            <!-- 连接数据库的基本信息 -->
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql:///jpa"/>
    		<property name="javax.persistence.jdbc.user" value="root"/>
    		<property name="javax.persistence.jdbc.password" value="root"/>
    		<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
    
            <!-- 配置JPA, 配置 hibernate 的基本属性 -->
            <property name="hibernate.format_sql" value="true"/>
    		<property name="hibernate.show_sql" value="true"/>
    		<property name="hibernate.hbm2ddl.auto" value="update"/>
        </properties>
    <persistence-unit>
    

    2.4 创建实体类

    // com.noodles.jpa.helloworld.Customer
    
    @Table(name="JPA_CUSTOMERS")   // 对应数据库中的表名
    @Entity
    public class Customer{
        private Integer id;
        private String lastName;
        private String email;
        private int age;
    
        @GeneratedValue(strategy=GenerationType.AUTO)
        @Id
        public Integer getId(){
            return id;
        }
    
        public void setId(Integer id){
            this.id = id;
        }
    
        @Column(name="LAST_NAME")  // 表中列名与字段不一致,需要添加注解
        public String getLastName() {
    		return lastName;
    	}
    	public void setLastName(String lastName) {
    		this.lastName = lastName;
    	}
    	public String getEmail() {
    		return email;
    	}
    	public void setEmail(String email) {
    		this.email = email;
    	}
    	public int getAge() {
    		return age;
    	}
    	public void setAge(int age) {
    		this.age = age;
    	}
    }
    

    2.5 编写主函数类

    import javax.persistence.EntityManager;
    import javax.persistence.EntityManagerFactory;
    import javax.persistence.EntityTransaction;
    import javax.persistence.Persistence;
    
    public class Main{
        public static void main(String[] args){
            // 1. 创建 EntitymanagerFactory
            String persistenceUnitName = "jpa001";
            EntityManagerFactory entityManagerFactory =
                Persistence.createEntityManagerFactory(PersistenceUnitName);
    
            // 2. 创建 EntityManager
            EntityManager entityManager = entityManagerFactory.createEntityMnager();
    
            // 3. 开启事务
            EntityTransaction transaction = entityManager.getTransaction();
            transaction.begin();
    
            // 4. 进行持久化操作
            Customer cus = new Customer();
            cus.setAge(15);
            cus.setEmail("noodlescnliu@gmail.com");
            cus.setLastName("Noodles");
    
            // 5. 提交事务
            transaction.commit();
    
            // 6. 关闭 EntityManager
            entityManager.close();
    
            // 7. 关闭 EntitymanagerFactory
            entityManagerFactory.close();
        }
    }
    

    3. JPA 基本注解

    3.1 @Entity

    • 用于实体类声明语句之前,指出该Java类为实体类,将映射到指定的数据库表;

    3.2 @Table

    • 当实体类与其映射的数据库表名不同时,需要使用@Table标注说明;
    • @Table标注的常用选项是 name,用于指明数据库的表名;
    • @Table标注还有catalogschema用于设置表所属的数据库目录或模式,通常为数据库名;

    3.3 @Id

    • 用于声明一个实体类的属性映射为数据库的主键;
    • 通常置于属性的getter方法之前;

    3.4 @GeneratedValue

    • 用于标注主键的生成策略,通过strategy属性指定;
      • IDENTITY:采用数据库ID自增长的方式来自增主键字段;Oracle不支持这种方式;
      • AUTO:JPA自动选择合适的策略,是默认选项;
      • SEQUENCE:通过序列产生主键,MySQL不支持这种方式;
      • TABLE:通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以是应用更易于数据库移植;

    3.5 @Basic

    • 表示一个简单的属性到数据库表的字段的映射,对没有任何标注的getXxx()方法,默认即为@Basic;
      • fetch:表示该属性的读取策略,有 EAGER 和 LAZY 两种;
      • optional:表示该属性是否允许为null,默认为true;

    3.6 @Column

    • 当实体的属性与其映射的数据库表的列不同名时,需要使用;
      • name:用于设置映射数据库表的列名;
      • length:定义列的长度;
      • columnDefinition:表示该字段在数据库中的实际类型;

    3.7 @Transient

    • 表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性;

    3.8 @Temporal

    • 用于调整Date类型的精度,用三种精度:DATE,TIME或TIMESTAMP
    • @Temporal(TemporalType.TIMESTAMP)

    4.JPA 相关API

    4.1 EntityManager

    • 实体的状态:
      • 新建状态:新创建的对象,尚未拥有持久性主键;
      • 持久化状态:已经拥有持久性主键并和持久化建立了上下文环境;
      • 游离状态:拥有持久化主键,但是没有与持久化建立上下文环境;
      • 删除状态:拥有持久化主键,已经和持久化建立上下文环境,但是从数据库中移除;
    • find(Class<T> entityClass, Object primaryKey):类似于Hibernate中Session的get方法;
    • getReference():类似于Hibernate中Session的load方法;
    • persist():类似于Hibernate中Session的save方法,使对象由临时状态变为持久化状态;
    • remove():类似于Hibernate中Session的delete方法,把对象对应的记录从数据库中移除;只能移除持久化对象,
      而Hibernate的delete方法实际上,还可以移除游离对象;
    • flush():将持久上下文环境的所有未保存实体的状态信息保存到数据库中;
    • refresh():用数据库实体记录的值更新实体对象的状态,即更新实例的属性值;
    • merge(T entity):拥有处理Entity的同步,即数据库的插入和更新操作;


    参考资料:

  • 相关阅读:
    Django(app的概念、ORM介绍及编码错误问题)
    Django(完整的登录示例、render字符串替换和redirect跳转)
    Construct Binary Tree from Preorder and Inorder Traversal
    Single Number II
    Single Number
    Binary Tree Level Order Traversal II
    Binary Tree Level Order Traversal
    Binary Tree Zigzag Level Order Traversal
    Recover Binary Search Tree
    Add Binary
  • 原文地址:https://www.cnblogs.com/linkworld/p/9147954.html
Copyright © 2011-2022 走看看