Spring+JPA如何集成Hibernate
admin
2023-06-09 01:01:48
0

1.JPA简介

 Java Persistence API (JPA),为开发人员提供了一种对象/关系映射(O-R Mapping)工具,用来管理 Java 应用中的关系数据。JPA是EJB3.0的一部分,现在公认为ORM行业标准。JPA本身只是一个规范,而不是产品; 它本身不能进行持续性或其他任何东西。JPA只是一组接口,需要一个实现。JPA允许通过标准的XML格式和注解格式声明,用于定义Java类如何映射到关系数据库表的映射规则。。JPA也定义了在对数据库中的对象处理查询和事务运行时的EntityManager的API。JPA定义一个对象级查询语言,JPQL,以允许从所述数据库中的对象的查询。JPA常用的解决方案:

    EclipseLink (Eclipse)
    Hibernate (RedHat)
    Open JPA (Apache)
    DataNucleus
    Ebean (SourceForge)
    TopLink Essentials (Glassfish)
    TopLink (Oracle)
    Kodo (Oracle)
JPA 规范也不是一成不变的。从2006年的JPA1.0,到2009年JPA2.0,最后到2013年JPA2.1。版本之间的特性具体参照

https://en.wikibooks.org/wiki/Java_Persistence/What_is_JPA%3F

https://en.wikipedia.org/wiki/Java_Persistence_API

2.Spring Hibernate JPA整合

准备

表
CREATE TABLE `Employee` (
  `id` int(11) unsigned NOT NULL,
  `name` varchar(20) DEFAULT NULL,
  `role` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2.1项目结构

Spring+JPA如何集成Hibernate

2.2 pom.xml



    4.0.0
    org.springframework
    gs-relational-data-access
    0.1.0

    
        
            org.springframework.boot
            spring-boot-starter-data-jpa
        
        
            com.h3database
            h3
        
        
            mysql
            mysql-connector-java
        
        
            org.springframework
            spring-test
        
        
            junit
            junit
            4.12
        
    

    
        
            spring-releases
            Spring Releases
            https://repo.spring.io/libs-release
        
        
            org.jboss.repository.releases
            JBoss Maven Release Repository
            https://repository.jboss.org/nexus/content/repositories/releases
        
    
    
        
            spring-releases
            Spring Releases
            https://repo.spring.io/libs-release
        
    
    
        
            
                io.spring.platform
                platform-bom
                1.1.2.RELEASE
                pom
                import
            
        
    

使用了platform-bom,方便了包的依赖管理。

依赖树结构

Spring+JPA如何集成Hibernate

2.3 persistence.xml


    
        org.hibernate.jpa.HibernatePersistenceProvider
    

2.4 spring.xml




    
        
        
        
        
    
    
        
        
        
        
        
        
            
                true
            
        
    

    
        
        
    

    

    
    
    
    
    

    
    

    

有的对象,不是必须的。为了保持完整性,做了保留。

可以配置entityManagerFactory的packagesToScan属性,没有配置也是可以的。

2.5 entity

package com.journaldev.spring.jpa.model;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Employee {
    @Id
    private int id;
    private String name;
    private String role;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getRole() {
        return role;
    }

    public void setRole(String role) {
        this.role = role;
    }

    @Override
    public String toString() {
        return "{ID=" + id + ",Name=" + name + ",Role=" + role + "}";
    }
}

2.6 接口

public interface EmployeeDAO {
    //Create
    public void save(Employee employee);
    //Read
    public Employee getById(int id);
    //Update
    public void update(Employee employee);
    //Delete
    public void deleteById(int id);
    //Get All
    public List getAll();
}

实现类

package com.journaldev.spring.jpa.dao;

import com.journaldev.spring.jpa.model.Employee;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.transaction.Transactional;

import java.util.List;

/**
 * Created by zhaoguoyu on 2016/6/22.
 */
@Transactional
@Repository
public class EmployeeDAOImpl implements EmployeeDAO {
    @PersistenceContext
    EntityManager em;


    @Override
    public void save(Employee employee) {
        em.persist(employee);
    }

    @Override
    public Employee getById(int id) {
        return em.find(Employee.class, id);
    }

    public void update(Employee employee) {  
        em.merge(employee);
    }

    @Override
    public void deleteById(int id) {
        em.remove(this.getById(id));
    }

    @Override
    public List getAll() {
        CriteriaBuilder builder =em.getCriteriaBuilder();
        final CriteriaQuery query = builder.createQuery(Employee.class);
        return this.em.createQuery(query).getResultList();
    }
}

2.7测试

测试类

import com.journaldev.spring.jpa.dao.EmployeeDAO;
import com.journaldev.spring.jpa.model.Employee;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests;
import org.springframework.test.context.junit4.SpringJUnit4Cla***unner;
import javax.annotation.Resource;

import java.util.Random;

/**
 * Created by zhaoguoyu on 2016/6/22.
 */
@RunWith(SpringJUnit4Cla***unner.class)
@ContextConfiguration(locations = "classpath:spring.xml")
public class SpringJPATest extends AbstractTransactionalJUnit4SpringContextTests {

    @Resource
    private EmployeeDAO employeeDAO;

    @Test
    public void testSave(){
        Employee emp = new Employee();
        int rand = new Random().nextInt(1000);
        emp.setId(rand);
        emp.setName("Pankaj");
        emp.setRole("Java Developer");
        employeeDAO.save(emp);
    }
    @Test
    public void testUpdate(){
        Employee emp = new Employee();
        int rand = new Random().nextInt(1000);
        emp.setId(rand);
        emp.setName("Pankaj");
        emp.setRole("Java Developer");
        employeeDAO.save(emp);
        emp.setName(emp.getName()+"_update");
        employeeDAO.update(emp);
    }
}

OR

import com.journaldev.spring.jpa.dao.EmployeeDAO;
import com.journaldev.spring.jpa.model.Employee;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.Random;

/**
 * Created by zhaoguoyu on 2016/6/22.
 */
public class Main {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml");
        final EmployeeDAO employeeDAO = ctx.getBean(EmployeeDAO.class);
        Employee emp = new Employee();
        int rand = new Random().nextInt(1000);
        emp.setId(rand);
        emp.setName("Pankaj");
        emp.setRole("Java Developer");
        employeeDAO.save(emp);

        Employee employee = employeeDAO.getById(rand);
        employee.setName(employee.getName() +"_update");
        employeeDAO.update(employee);
    }
}

有一点需要说明。默认使用的日志是logback.号称比log4j更优秀的一款。

默认的日志配置logback.xml



    
        
            
                %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
            
        
    
    
        
    

    
        
    

相关内容

热门资讯

抵达!神舟二十三号载人飞船与空... 据中国载人航天工程办公室消息,神舟二十三号载人飞船入轨后,于北京时间2026年5月25日2时45分,...
神舟二十三号载人飞船发射取得圆... 5月24日,搭载神舟二十三号载人飞船的长征二号F遥二十三运载火箭在酒泉卫星发射中心点火发射。神舟二十...
伊朗总统准备向世界保证不寻求核... 伊朗总统佩泽希齐扬5月24日在接受采访时表示,“伊朗准备向全世界保证,正如已故伊朗最高领袖阿里·哈梅...
火星上出现一摞整齐叠放的石头,... 那是谁干的? 毅力号火星车在火星上发现了一摞整齐叠放的石头。NASA / JPL-Caltech ...
八国发表联合声明,谴责以色列国... △以色列国家安全部长伊塔马尔·本-格维尔(资料图)当地时间24日,阿联酋、约旦、土耳其、埃及、印度尼...
神舟二十三号载人飞船发射升空 IT之家 5 月 24 日消息,刚刚,搭载神舟二十三号载人飞船的长征二号 F 遥二十三运载火箭在酒泉...
浙江上线“创新积分制”数智平台 来源:中国新闻网 中新网杭州5月24日电(鲍梦妮)5月24日,在2026年浙江省“全国科技活动周”上...
国内知名冷门绝学大咖齐聚深圳,... 本文转自【光明日报】; 5月22日上午,作为2026文化强国建设高峰论坛重要组成部分,首届冷门绝学传...
神舟二十三号载人飞行任务航天员... 据微信公众号“中国载人航天”消息,5月24日20时16分,神舟二十三号载人飞行任务航天员乘组出征仪式...
以总理:同特朗普一致认为须消除... 新华社耶路撒冷5月24日电(记者庞昕熠 王卓伦)以色列总理内塔尼亚胡24日在社交平台发文称,他和美国...