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的同步,即数据库的插入和更新操作;


    参考资料:

  • 相关阅读:
    CSS3相关编码规范
    WEB开发中常见的漏洞
    Python常用端口扫描
    33、Django实战第33天:我的消息
    32、Django实战第32天:我的收藏
    31、Django实战第31天:我的课程
    30、Django实战第30天:修改邮箱和用户信息
    29、Django实战第29天:修改密码和头像
    28、Django实战第28天:个人信息展示
    27、Django实战第27天:全局搜索功能开发
  • 原文地址:https://www.cnblogs.com/linkworld/p/9147954.html
Copyright © 2011-2022 走看看