Hibernate JPA简介

简介: Hibernate除了是一个ORM框架之外,同时还实现了Java EE的一项标准JPA。我们在前面已经看到了Hibernate可以在注解方面直接使用JPA。

Hibernate除了是一个ORM框架之外,同时还实现了Java EE的一项标准JPA。我们在前面已经看到了Hibernate可以在注解方面直接使用JPA。现在我们来看看如何在Hibernate中使用JPA。

关于JPA注解前面已经做了一定介绍,所以这里只用一个最简单的实体类。

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    @Column
    private String username;

}

配置persistence.xml

JPA标准要求配置文件名为persistence.xml,并且位于META-INF文件夹下。所以我们需要对应建立persistence.xml文件。persistence.xml文件如下,我们可以看到其中和hibernate.cfg.xml很相似。

<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
             http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
             version="2.1">

    <persistence-unit name="CRM">
        <description>
            Hibernate JPA configuration file
        </description>

        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <class>yitian.bean.User</class>
        <properties>
            <property name="javax.persistence.jdbc.driver"
                      value="com.mysql.jdbc.Driver"/>

            <property name="javax.persistence.jdbc.url"
                      value="jdbc:mysql://localhost:3306/test"/>

            <property name="javax.persistence.jdbc.user"
                      value="root"/>

            <property name="javax.persistence.jdbc.password"
                      value="12345678"/>

            <property name="hibernate.show_sql"
                      value="true"/>
            <property name="hibernate.format_sql"
                      value="true"/>
            <property name="hibernate.hbm2ddl.auto"
                      value="create"/>
        </properties>

    </persistence-unit>

</persistence>

获取EntityManager

使用Hibernate的话需要建立一个SessionFactory,然后用SessionFactory获取Session进行对应的增删查改操作。和Hibernate类似,使用JPA需要创建一个EntityManagerFactory对象并获取EntityManager。

EntityManagerFactory factory = Persistence.createEntityManagerFactory("CRM");
EntityManager manager = factory.createEntityManager();

增删查改

获取到EntityManager之后,就可以进行增删查改了。这里用一个测试方法简单演示了一下。我们可以看到,虽然API不同,但是使用方法却和Hibernate自己的API很相似,非常容易使用。

    @Test
    public void testCRUD() {
        User user = new User();
        user.setUsername("yitian");

        User user2 = new User();
        user2.setUsername("zhang3");
        EntityManager manager = factory.createEntityManager();
        //增加数据
        manager.getTransaction().begin();
        manager.persist(user);
        manager.persist(user2);
        manager.getTransaction().commit();

        //更新数据
        manager.getTransaction().begin();
        user2.setUsername("zhang4");
        manager.flush();
        manager.getTransaction().commit();

        //查找数据
        manager.getTransaction().begin();
        User u = manager.getReference(User.class, 1L);
        logger.info(u.toString());
        Assert.assertEquals(user.getUsername(), u.getUsername());
        u = manager.find(User.class, 2L);
        logger.info(u.toString());
        Assert.assertEquals(user2.getUsername(), u.getUsername());
        manager.getTransaction().commit();
        //删除数据
        manager.getTransaction().begin();
        manager.remove(user2);
        manager.getTransaction().commit();
        Assert.assertNull(manager.find(User.class, 2L));
        manager.close();
    }

查询

JPA同样支持类似HQL的JPQL、Criteria以及SQL三种查询方式。这里不作说明,直接给出一个小例子。这个小例子用的是MySQL自带的样例数据库world。关于这个例子中的实体类,可以参考我的另一篇文章Hibernate查询简介

    @Test
    public void testJPQL() {
        EntityManager manager = factory.createEntityManager();
        //查询所有国家
        List<Country> countries = manager.createQuery("from Country", Country.class).getResultList();
        //查询c开头的所有国家
        List<Country> countriesStartWithC = manager.createQuery("from Country c where c.name like 'c%'", Country.class).getResultList();
        //countries.forEach(country -> logger.info(country.toString()));
        countriesStartWithC.forEach(country -> logger.info(country.toString()));
        //查询中国的国家代码
        List<String> countryCodes = manager.createQuery("select c.code from Country c where c.name='China'", String.class).getResultList();
        countryCodes.forEach(c -> logger.info(c));
        //查询中国的所有城市
        List<City> cities = manager.createQuery("from City c where c.country.name='China'", City.class).getResultList();
        cities.forEach(c -> logger.info(c.toString()));
        //查询人口最多的15个城市
        List<City> mostCrowdedCities = manager.createQuery("from City c order by c.population desc", City.class).setMaxResults(15).getResultList();
        mostCrowdedCities.forEach(c -> logger.info(c.toString()));


    }

    @Test
    public void testCriteria() {
        EntityManager manager = factory.createEntityManager();
        //查询人口最少的20个城市
        CriteriaBuilder builder = manager.getCriteriaBuilder();
        CriteriaQuery<City> query = builder.createQuery(City.class);
        Root<City> root = query.from(City.class);
        query.select(root);
        query.orderBy(builder.asc(root.get("population")));
        List<City> cities = manager.createQuery(query).setMaxResults(20).getResultList();
        cities.forEach(city -> logger.info(city.toString()));

    }

    @Test
    public void testSQL() {
        EntityManager manager = factory.createEntityManager();
        //东亚所有国家和地区
        Query query = manager.createNativeQuery("SELECT name,population FROM country WHERE Region='Eastern Asia'");
        List<Object[]> countries = query.getResultList();
        for (Object[] country : countries) {
            String name = (String) country[0];
            int population = (int) country[1];
            logger.info("Name:{} Population:{}", name, population);
        }

    }

十几年以前,对象关系映射的概念风生水起,涌现了著名的Hibernate等大量对象关系映射框架,然后Java语言在吸收了Hibernate等框架的优秀概念之后,制定了JPA标准。Hibernate等框架也根据JPA标准,规范了自己的API和实现。可以看到,这些优秀框架的出现,让我们开发项目变得越来越简单。在此感谢这些优秀框架的作者!

相关文章
|
6月前
|
XML Java 数据库连接
Spring Boot的数据访问之Spring Data JPA以及Hibernate的实战(超详细 附源码)
Spring Boot的数据访问之Spring Data JPA以及Hibernate的实战(超详细 附源码)
106 0
|
1月前
|
SQL Java 数据库连接
springBoot+Jpa(hibernate)数据库基本操作
springBoot+Jpa(hibernate)数据库基本操作
32 0
|
3月前
|
Java 数据库连接 数据库
携手前行:在Java世界中深入挖掘Hibernate与JPA的协同效应
【8月更文挑战第31天】Java持久化API(JPA)是一种Java规范,为数据库数据持久化提供对象关系映射(ORM)方法。JPA定义了实体类与数据库表的映射及数据查询和事务控制方式,确保不同实现间的兼容性。Hibernate是JPA规范的一种实现,提供了二级缓存、延迟加载等丰富特性,提升应用性能和可维护性。通过结合JPA和Hibernate,开发者能编写符合规范且具有高度可移植性的代码,并利用Hibernate的额外功能优化数据持久化操作。
41 0
|
3月前
|
Java 数据库连接 数据库
Spring Data JPA 与 Hibernate 之区别
【8月更文挑战第21天】
73 0
|
3月前
|
SQL Java 数据库连接
Hibernate 和 JPA 有什么区别?
【8月更文挑战第21天】
199 0
|
5月前
|
Java 数据库连接 数据库
JPA和Hibernate的乐观锁与悲观锁
木头左讲解JPA和Hibernate中的乐观锁与悲观锁。乐观锁在并发更新少、冲突处理成本高、数据一致性要求不严的场景下适用,利用`@Version`注解防止冲突。而悲观锁适合并发更新频繁、处理冲突成本低、需高度数据一致性的场景,通过`@Lock`注解实现锁机制。选择合适的锁策略对提升数据库性能和保证数据一致性至关重要。
JPA和Hibernate的乐观锁与悲观锁
|
5月前
|
Java 数据库连接 API
解锁你的数据库:JPA和Hibernate的乐观锁与悲观锁
本文由木头左介绍JPA和Hibernate中的乐观锁与悲观锁。乐观锁假设无冲突,通过`@Version`注解防止并发更新,适用于更新不频繁、处理冲突成本高、数据一致性要求不高的场景。悲观锁假设有冲突,利用`@Lock`注解实现加锁,适用于并发更新频繁、处理冲突成本低、数据一致性要求高的情况。选择哪种锁取决于具体需求。
解锁你的数据库:JPA和Hibernate的乐观锁与悲观锁
|
5月前
|
缓存 Java 数据库连接
深入理解Java中的JPA与Hibernate
深入理解Java中的JPA与Hibernate
|
5月前
|
SQL Java 数据库连接
从理论到实践:Hibernate与JPA在Java项目中的实际应用
【6月更文挑战第25天】在Java持久层,Hibernate与JPA提供ORM及数据库操作简化。JPA是EE规范,定义ORM接口;Hibernate是其实现,功能丰富。在一个在线书店项目中,使用@Entity标注实体类如Book,通过JpaRepository接口(如BookRepository)进行数据访问。服务层调用仓库接口方法,如搜索书籍。当需自定义查询时,可使用JPQL或SQL。Spring的@Transactional注解处理事务管理,展示出高效开发流程。
44 0
|
5月前
|
SQL 缓存 Java
Java持久化新篇章:Hibernate与JPA的进阶探索
【6月更文挑战第25天】在Java持久化技术中,Hibernate和JPA日益发展,本文以电商系统为例,展示它们的新特性和进阶应用。JPA通过注解如@Entity实现对象-关系映射,EntityManager处理CRUD操作。Hibernate则扩展了JPA,提供二级缓存、自定义HQL/SQL查询及批量操作,如批量更新商品价格,显示了其在性能优化和复杂需求上的灵活性。两者在现代Java开发中不可或缺。
33 0