Java高手速成 | Hibernate的配置文件与JPA API的基本用法

举报
TiAmoZhang 发表于 2023/02/15 09:16:49 2023/02/15
【摘要】 Hibernate的配置文件与JPA API的基本用法

01、Hibernate的配置文件

在Hibernate的配置文件中,需要指定连接数据库的信息,包括数据库URL,用户名和口令,JDBC驱动程序等。

hibernate.cfg.xml 

<hibernate-configuration>
  <session-factory >
    <property name="dialect">
       org.hibernate.dialect.MySQL8Dialect
    </property>
    <property name="connection.driver_class">
      com.mysql.jdbc.Driver
    </property>
    <property name="connection.url">
       jdbc:mysql://localhost:3306/sampledb?useSSL=false
    </property>
    <property name="connection.username">
      root
    </property>
    <property name="connection.password">
      1234
    </property>
    <!-- 指定是否在运行时在控制台显示执行的SQL语句 -->
    <property name="show_sql">true</property>
 
    <!-- 在启动时删除并重创建数据库Schema -->
    <property name="hbm2ddl.auto">create</property>
 
    <!-- Names the annotated entity class -->
    <mapping class="mypack.Customer"/>
 
  </session-factory>
</hibernate-configuration>

 以上配置文件通过元素设定本范例包含Customer实体类,Hibernate在初始化时,会根据这个配置信息去读取Customer类的描述对象-关系映射信息的注解,把这些元数据加载到内存中。

02、JPA API的基本用法


Hibernate API和JPA API中主要接口之间有一些对应关系,例如:

JPA API ----------------------- Hibernate API

EntityManagerFactory ----- SessionFactory

EntityManager ---------------- Session

EntityTransaction ------------- Transaction

SessionFactory接口在JPA API中的对等接口是javax.persistence.EntityManagerFactory;Session接口在JPA API中的对等接口是javax.persistence.EntityManager;Transaction接口在JPA API中的对等接口是javax.persistence.EntityTransaction。Query接口在JPA API中的对等接口是javax.persistence.Query。

EntityManager接口提供了操纵数据库的各种方法,如:

(1) persist()方法:把Java对象保存到数据库中。等价于Session接口的persist()方法。

(2) merge()方法:保存或更新数据库中的Java对象。等价于Session接口的merge()方法。

(3) remove()方法:把特定的Java对象从数据库中删除。类似于Session接口的delete()方法。EntityManager接口的remove()方法只能删除持久化状态的对象,而Session接口的delete()方法可以删除持久化状态或游离状态的对象。。

(4) find()方法:从数据库中加载Java对象。等价于Session接口的get()方法。

下面这个BusinessService类通过JPA API来访问数据库。

直接上源码。

package mypack;
 
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.EntityTransaction;
import javax.persistence.Query;
import java.io.*;
import java.sql.Date;
import java.sql.Timestamp;
import java.util.*;
 
public class BusinessService{
 
  public static EntityManagerFactory entityManagerFactory;
  
  /** 初始化JPA,创建EntityManagerFactory实例 */
  static{
    try{
      entityManagerFactory=
           Persistence.createEntityManagerFactory( "myunit" );
    }catch(Exception e){
      e.printStackTrace();
      throw e;
    }
  }
  
  /** 查询所有的Customer对象,
      然后调用printCustomer()方法打印Customer对象信息 */
  public void findAllCustomers(PrintWriter out)throws Exception{
    EntityManager entityManager =
           entityManagerFactory.createEntityManager();
    EntityTransaction tx = null;
    try {
      tx = entityManager.getTransaction();
      tx.begin(); //开始一个事务
      Query query=entityManager.createQuery(
           "from Customer as c order by c.name asc");
      List customers=query.getResultList();
      for (Iterator it = customers.iterator(); it.hasNext();) {
         printCustomer(out,(Customer) it.next());
      }
 
      tx.commit(); //提交事务
 
    }catch (RuntimeException e) {
      if (tx != null) {
         tx.rollback();
      }
      throw e;
    } finally {
       entityManager.close();
    }
  }
 
  /** 持久化一个Customer对象 */
  public void saveCustomer(Customer customer){
    EntityManager entityManager =
            entityManagerFactory.createEntityManager();
 
    EntityTransaction tx = null;
    try {
      tx = entityManager.getTransaction();
      tx.begin();
      entityManager.persist(customer);
      tx.commit();
 
    }catch (RuntimeException e) {
      if (tx != null) {
        tx.rollback();
      }
      throw e;
    } finally {
      entityManager.close();
    }
  }
 
  /** 按照OID加载一个Customer对象,然后修改它的属性 */
  public void loadAndUpdateCustomer(Long customer_id,String address){
    EntityManager entityManager =
                  entityManagerFactory.createEntityManager();
    EntityTransaction tx = null;
    try {
      tx = entityManager.getTransaction();
      tx.begin();
      Customer c=entityManager
                    .find(Customer.class,customer_id);
      c.setAddress(address);
      tx.commit();
 
    }catch (RuntimeException e) {
      if (tx != null) {
        tx.rollback();
      }
      throw e;
    } finally {
      entityManager.close();
    }
  }
 
  /**删除Customer对象 */
  public void deleteCustomer(Customer customer){
    EntityManager entityManager =
            entityManagerFactory.createEntityManager();
    EntityTransaction tx = null;
    try {
      tx = entityManager.getTransaction();
      tx.begin();
      //获得持久化状态的Customer对象
      Customer c=entityManager
          .find(Customer.class,customer.getId());
      entityManager.remove(c);
      tx.commit();
 
    }catch (RuntimeException e) {
      if (tx != null) {
        tx.rollback();
      }
      throw e;
    } finally {
      entityManager.close();
    }
  }
  
  /** 把Customer对象的信息输出到控制台,如DOS 控制台*/
  private void printCustomer(PrintWriter out,Customer customer)
                                      throws Exception{……}
 
  public void test(PrintWriter out) throws Exception{……}
 
  public static void main(String args[]) throws Exception{
    new BusinessService2().test(new PrintWriter(System.out,true));
    entityManagerFactory.close();
  }
}

 对JPA的初始化非常简单,只要通过javax.persistence.Persistence的静态方法createEntityManagerFactory()来创建EntityManagerFactory对象:

entityManagerFactory=
  Persistence.createEntityManagerFactory( "myunit" );

以上Persistence.createEntityManagerFactory( “myunit” )方法中的参数“myunit”指定持久化单元包的名字。

JPA会到persistence.xml配置文件中读取相应的持久化单元包中的配置信息。

所有访问数据库的操作都使用以下流程:

EntityManager entityManager =
     entityManagerFactory.createEntityManager();
EntityTransaction tx = null;
try {
  tx = entityManager.getTransaction();
  tx.begin(); //声明开始事务
  //执行查询、保存、更新和删除等各种数据访问操作
  ……
  tx.commit(); //提交事务
}catch (RuntimeException e) {
  if (tx != null)
    tx.rollback();
  throw e;
} finally {
  entityManager.close();
}

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。