Hibernate笔记4(JPA)

JPA概述

JPA概念: Java Persist API.是Sun公司发布的规范. 规范了面向对象操作数据库的规则.JPA规范很大程度上参考了Hibernate设计.Hibernate也第一时间宣布支持JPA规范.

JPA搭建

  • 导包
    hibernate required中的所有包,数据库驱动包,jpa包
    • 实体(注解映射)
@Entity
@Table(name="cst_customer")
public class Customer {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="cust_id")
    private Long cust_id;
    @Column
    private String cust_name;
    ...
    //一对多,放弃关系维护
    @OneToMany(targetEntity=LinkMan.class,mappedBy="customer")
    private Set<LinkMan> linkmen=new HashSet<>();
@Entity
@Table(name="cust_linkman")
public class LinkMan {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="lkm_id")
    private Long lkm_id;
    @Column
    private String lkm_name;
    ...
    //多对一
    @ManyToOne(targetEntity=Customer.class)
    @JoinColumn(name="lkm_cust_id",referencedColumnName="cust_id")
    private Customer customer;
  • 创建Jpa主配置文件
    jpa主配置文件位置
<!--
    persistence-unit : 配置主配置文件的根元素,可以出现多个.当项目需要连接多个数据库时,可以分别配置每个数据库的连接信息.
        name:给当前的配置起个名字. 读取配置时根据名字读取
            entityManagerFactory = Persistence.createEntityManagerFactory("abc");
        transaction-type : 事务管理方式
            RESOURCE_LOCAL: 本地事务,普通事务
            jta: jta规范事务
    -->  
    <persistence-unit name="abc" transaction-type="RESOURCE_LOCAL">  

       <!-- jpa规范的实现厂商属性,hibernate键值对属性 -->         
      <properties>  
                <!-- 配置使用c3p0连接池 --> 
              <!--  <property name="hibernate.connection.provider_class"
                         value="org.hibernate.connection.C3P0ConnectionProvider" ></property>
                <property name="hibernate.c3p0.max_size" value="2"></property>  -->
               <!-- 数据库的连接信息 -->    
               <property name="hibernate.connection.driver_class"  value="com.mysql.jdbc.Driver" />    
               <property name="hibernate.connection.url"  value="jdbc:mysql://localhost:3306/crm"/>  
               <property name="hibernate.connection.username" value="root" />    
               <property name="hibernate.connection.password" value="123456" />   
               <!-- 指定方言 -->   
               <property name="hibernate.dialect"  value="org.hibernate.dialect.MySQL5Dialect" />
               <!-- 生成DDL的策略 -->
               <property name="hibernate.hbm2ddl.auto" value="update" />  
               <!-- 是否显示SQL语句 -->    
               <property name="hibernate.show_sql" value="true" />
               <!-- 是否格式化SQL语句 -->    
               <property name="hibernate.format_sql" value="true" />   
        </properties>    
    </persistence-unit> 

封装工具类

public class JPAUtils {
    private static EntityManagerFactory emf=null;
    static{
        //创建EntityManagerFactory
        emf = Persistence.createEntityManagerFactory("abc");
    }

    //获取entityManager
    public static EntityManager getEntiryManager(){
        //创建entityManager
        EntityManager em = emf.createEntityManager();

        return em;
    }
}

Jpa api操作


  • 这里写图片描述

  • 这里写图片描述
    立即查询,没有任何查询策略的应用
    这里写图片描述
        //先查后改
        Customer c = em.find(Customer.class, 1L);
        c.setCust_name("黑马程序员");

第二种更改方式

            Customer c = new Customer(); //瞬时状态
            c.setCust_id(1L);  //游离
            c.setCust_name("传智博客");  //游离
            Customer merge=em.merge(c);  //持久化状态

  • 这里写图片描述
  • JPQL使用
    这里写图片描述
    JavaPersistQueryLanguage JPA查询语言,JPQL与HQL语法一致

多对多类型映射

多对多不维护关系方
这里写图片描述

用户类添加维护关系
@ManyToMany(targetEntity=Role.class)
    @JoinTable(name="sys_user_role",joinColumns=@JoinColumn(name="user_id",referencedColumnName="user_id"),
    inverseJoinColumns=@JoinColumn(name="role_id",referencedColumnName="role_id"))

基本操作

  • 添加多对多数据
       //创建用户
        User u = new User();
        u.setUser_name("李四");

        //创建角色
        Role r = new Role();
        r.setRole_name("教师");
        Role r2 = new Role();
        r2.setRole_name("行政");

        //添加关系
        u.getRoles().add(r);
        u.getRoles().add(r2);

        //保存
        em.persist(u);
        em.persist(r);
        em.persist(r2);
  • 移除关系
        //获取用户
        User u = em.find(User.class, 1L);
        //获取角色
        Role r = em.find(Role.class, 2L);
        u.getRoles().remove(r);
  • 添加关系
        //获取用户
        User u = em.find(User.class, 1L);
        //获取角色
        Role r = em.find(Role.class, 4L);
        //添加角色
        u.getRoles().add(r);

猜你喜欢

转载自blog.csdn.net/sinat_29211659/article/details/81136851