• JPA-helloWorld


    1.什么是JPA

      全称Java Persistence API,用于对象持久化的API。

      JPA与ORM框架(对象关系模型如Hibernate)的关系就如同JDBC与mysql数据库驱动一样,前者是java官方提供的标准(只提供接口),后者是具体厂商的实现类。

      学Hibernate时主要使用的是配置的方式;而学JPA主要使用的是注解的方式,也可以看作是学习怎么使用注解的方式使用Hibernate

      事实上JPA的始作俑者就是Hibernate的作者。

    2.创建一个JPA的helloWorld工程

      createJPA工程,jpa版本选择2.0,

      创建好的工程目录中带有persistence.xml文件,内容如下:

      

      然后创建实体类,并加入注解

    package com.entities;
    
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.Table;
    
    @Table(name = "student_hello")//生成的表名
    @Entity//加在类上,声明为实体
    public class Student {
        private Integer id;
        private String name;
        private Integer age;
    
        @GeneratedValue(strategy = GenerationType.AUTO)//可以定义主键的生成策略为自动,默认是自动
        @Id//加在get方法上,表示id属性映射为主键
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getName() {//get方法前也可以不加注解,那么会默认添加上@basic注解
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
    }

      编写测试方法

    package com.test;
    
    import javax.persistence.EntityManager;
    import javax.persistence.EntityManagerFactory;
    import javax.persistence.EntityTransaction;
    import javax.persistence.Persistence;
    
    import com.entities.Student;
    
    public class TestHello {
    
        public static void main(String[] args) {
            EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("jpa-hello");
            EntityManager entityManager = entityManagerFactory.createEntityManager();
            EntityTransaction entityTransaction = entityManager.getTransaction();
    
            Student s = new Student();
            s.setAge(10);
            s.setName("ji");
    
            entityTransaction.begin();
            entityManager.persist(s);
            entityTransaction.commit();
            entityManager.close();
            entityManagerFactory.close();
        }
    
    }

    3.注解

      @Entity  在类上添加,表明是一个实体类,这时也可以不加@Table,那么表名就是类名

      @Table(name="表名")

      @Id  通常加在get方法上,表名该字段为主键

      @GeneratedValue(strategy=GenerationType.)  加在主键的get方法上

        当使用table的生成策略时

        @TableGenerator(name = "student_id", 
                table="jpa_id_generator",
                pkColumnName = "PK_NAME", 
                pkColumnValue = "STUDENT_ID", 
                allocationSize = 100, //每次存新列的时候,主键相比上一次增加100,jpa_id_generator中的对应PK_VALUE加1
            //也可以这样理解,每次加新列时先用jpa_id_generator中的对应PK_VALUE乘allocationSize作为主键,然后PK_VALUE再加1
                valueColumnName = "PK_VALUE")
        // 可以定义主键的生成策略为自动,默认是自动
        @GeneratedValue(strategy = GenerationType.TABLE, generator = "student_id")
        @Id // 加在get方法上,表示id属性映射为主键
        public Integer getId() {
            return id;
        }

      @Basic  若get方法上没加注解那么就相当于加了@Basic,会自动把属性映射到对应的列上,列名就是属性名,长度类型等信息也是默认的

      @Column(name="列名",length=50,nullable=false)  长度50不能为空

      @Transient  加在get方法上,那么该方法将不会在数据表中生成对应列

      @Temporal(TemporalType.DATE/TIME/TIMESTAMP)  加在日期类型的属性的get方法上,那么在数据库中分别存储为日期,时间,时间戳类型

    3.常用API

      ①Persistence  两个静态方法,可以用于去创建EntityManagerFactory

            //创建EntityManagerFactory有如下两种方法,对应Persistence的两个方法
            // EntityManagerFactory entityManagerFactory =
            // Persistence.createEntityManagerFactory("jpa-hello");//需要传入<persistence-unit name="jpa-hello" transaction-type="RESOURCE_LOCAL">的名字
            Map<String, String> properties = new HashMap<>();
            properties.put("hibernate.show_sql", "true");
            EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("jpa-hello", properties);//前面是传名字,后面是传创建需要的配置
            

      ②EntityManagerFactory  .createEntityManager()创建EntityManager

      ③EntityManager  

                .getTransaction()得到事务

                4个常用API  find,getReference,persist,remove

        @Test
        public void testFind() {
            Student s = entitiyManager.find(Student.class, 1);// 在这里时就查询了,且不需要强转
            System.out.println("----------------------");
            System.out.println(s);
        }
    
        // 类似于session的load,,reference:参考
        @Test
        public void testGetReference() {
            Student s = entitiyManager.getReference(Student.class, 1);// 这句完以后,只是一个代理对象
            System.out.println(s.getClass().getName());// com.entities.Student_$$_javassist_0
            System.out.println("----------------------");
            System.out.println(s);// 到这里时才查询
        }
    
        @Test
        public void testPersist() {
            Student s = new Student();
            s.setAge(10);
            s.setName("qq");
            // s.setId(222);//若事先加有id那么就会报异常
            entitiyManager.persist(s);// 若使用的是table的主键生成方式会在commit时才insert,若是Auto的生成方式会在这句就insert
            System.out.println(s.getId());
        }
    
        // 与session.delete的区别是不能删除游离对象
        @Test
        public void testRemove() {
    //        Student s = new Student();
    //        s.setId(1000);//s就是游离对象
    //        entitiyManager.remove(s);//会报异常java.lang.IllegalArgumentException
    
            entitiyManager.remove(entitiyManager.find(Student.class, 1001));// 在commit时才执行delete语句
            System.out.println("------------");
        }

              entityManager.merge(T entity)   功能类似与session的saveOrUpdate

              

              entityManager.flush() 将缓存中的变化,发送对应的SQL语句,直到事务结束,数据库中数据才会改变。commit()方法中隐藏有这句

              

              其他

               

            查询

              

      ④Transaction  .begin();开启事务  .commit();提交事务  .rollback();回滚

                

  • 相关阅读:
    GOIP connects with Elastix through “config by line”
    Asterisk 的安全性
    sql2005性能优化(在32位系统上突破2G内存使用量的方法) .
    Asterisk的type类型和身份认证
    Elastix GOIP 网关配合
    Elastix 安装G729 G723语音编码
    Delegate,Action,Func,匿名方法,匿名委托,事件 (转载)
    Proxmox Reset Root Password
    volatile适用场景
    ANT教程经典
  • 原文地址:https://www.cnblogs.com/feifeiyun/p/6900436.html
Copyright © 2020-2023  润新知