栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【SpringData&JPA从入门到精通】05-Spring 整合 JPA

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【SpringData&JPA从入门到精通】05-Spring 整合 JPA

笔记来源:尚硅谷jpa开发教程全套完整版(初学者零基础入门)

文章目录
  • Spring 整合 JPA
    • 1、三种整合方式
    • 2、pom 依赖
    • 3、jdbc 配置
    • 4、Spring 配置
    • 5、HelloWorld
      • 准备工作
      • 初始化表
      • 测试保存

Spring 整合 JPA 1、三种整合方式
  • 1)LocalEntityManagerFactoryBean:适用于那些仅使用 JPA 进行数据访问的项目,该 FactoryBean 将根据 JPAPersistenceProvider 自动检测配置文件进行工作,一般从 ”META-INF/persistence.xml“ 读取配置信息,这种方式最简单,但不能设置 Spring 中定义的 DataSource,且不支持 Spring 管理的全局事务
  • 2)从 JNDI 中获取:用于从 JavaEE 服务器获取指定的 EntityManagerFactory,这种方式在进行 Spring 事务管理时一般要使用 JTA 事务管理
  • 3)LocalContainerEntityManagerFactoryBean:适用于所有环境的 FactoryBean,能全面控制 EntityManagerFactory 配置,如指定 Spring 定义的 DataSource 等等

综上所述,第三种整合方式最优

2、pom 依赖

依赖 jar 包清单:

  • Hibernate 相关
  • JPA 相关
  • c3p0 相关
  • MySQL 驱动相关
  • Spring 相关

    8
    8
    4.0.0.RELEASE



    
    
        antlr
        antlr
        2.7.7
    
    
        dom4j
        dom4j
        1.6.1
    
    
        org.hibernate.common
        hibernate-commons-annotations
        4.0.2.Final
    
    
        org.hibernate
        hibernate-core
        4.2.4.Final
    
    
        org.javassist
        javassist
        3.15.0-GA
    
    
        org.jboss.logging
        jboss-logging
        3.1.0.GA
    
    
        org.jboss.spec.javax.transaction
        jboss-transaction-api_1.1_spec
        1.0.1.Final
    
    
    
        org.hibernate.javax.persistence
        hibernate-jpa-2.0-api
        1.0.1.Final
    
    
        org.hibernate
        hibernate-entitymanager
        4.2.4.Final
    
    
    
        com.mchange
        c3p0
        0.9.2.1
    
    
        org.hibernate
        hibernate-c3p0
        4.2.4.Final
    
    
        com.mchange
        mchange-commons-java
        0.2.3.4
    
    
    
        mysql
        mysql-connector-java
        8.0.28
    
    
    
        net.sourceforge.cglib
        com.springsource.net.sf.cglib
        2.2.0
    
    
        org.aopalliance
        com.springsource.org.aopalliance
        1.0.0
    
    
        org.aspectj
        com.springsource.org.aspectj.weaver
        1.6.4.RELEASE
    
    
        commons-logging
        commons-logging
        1.1.3
    
    
        org.springframework
        spring-aop
        ${spring.version}
    
    
        org.springframework
        spring-aspects
        ${spring.version}
    
    
        org.springframework
        spring-beans
        ${spring.version}
    
    
        org.springframework
        spring-context
        ${spring.version}
    
    
        org.springframework
        spring-core
        ${spring.version}
    
    
        org.springframework
        spring-expression
        ${spring.version}
    
    
        org.springframework
        spring-jdbc
        ${spring.version}
    
    
        org.springframework
        spring-orm
        ${spring.version}
    
    
        org.springframework
        spring-tx
        ${spring.version}
    
    
        org.springframework
        spring-web
        ${spring.version}
    
    
        org.springframework
        spring-webmvc
        ${spring.version}
    
    
    
        junit
        junit
        4.13.2
        test
    

3、jdbc 配置

resources 目录下新建文件 db.properties,配置信息如下

jdbc.user=root
jdbc.password=root
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql:///jpa
4、Spring 配置

resources 目录下新建文件 applicationContext.xml,配置清单如下

  • 自动扫描包
  • c3p0 数据源
  • DataSource
  • EntityManagerFactory
  • 事务管理器
  • 基于注解的事务

配置信息如下



    
    
    
    
    
    
        
        
        
        
    
    
    
        
        
        
        
            
        
        
        
        
        
            
                true
                true
                update
            
        
    
    
    
        
        
    
    
    

5、HelloWorld 准备工作

Person 实体类

@Table(name = "JPA_PERSONS")
@Entity
public class Person
{
    private Integer id;
    private String lastName;
    private String email;
    private int age;

    @GeneratedValue
    @Id
    public Integer getId() {
        return id;
    }

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

    @Column(name = "LAST_NAME")
    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

PersonDao 类

@Repository
public class PersonDao
{
    @PersistenceContext
    private EntityManager entityManager;

    public void save(Person p){
        entityManager.persist(p);
    }
}

PersonService 类

@Service
public class PersonService
{
    @Autowired
    private PersonDao personDao;

    @Transactional
    public void savePerson(Person p1, Person p2) {
        personDao.save(p1);
        personDao.save(p2);
    }
}
初始化表
public class JPATest
{
    private ApplicationContext context;
    {
        context = new ClassPathXmlApplicationContext("applicationContext.xml");
    }

    @Test
    public void testDataSource() throws SQLException {
        DataSource dataSource = context.getBean(DataSource.class);
        System.out.println(dataSource.getConnection());
    }
}

执行 testDataSource 测试方法,查看日志信息,能够打印出连接对象信息,说明 DataSource 数据源配置正常

com.mchange.v2.c3p0.impl.NewProxyConnection@71104a4

查看 JPA_PERSONS 数据表结构也正常生成

测试保存
public class JPATest
{
    private ApplicationContext context;
    private PersonService personService;
    {
        context = new ClassPathXmlApplicationContext("applicationContext.xml");
        personService = context.getBean(PersonService.class);
    }

    @Test
    public void testPersonService(){
        Person p1 = new Person();
        p1.setLastName("AA");
        p1.setAge(11);
        p1.setEmail("AA@qq.com");
        Person p2 = new Person();
        p2.setLastName("BB");
        p2.setAge(22);
        p2.setEmail("BB@qq.com");

        System.out.println(personService.getClass().getName());
        personService.savePerson(p1, p2);
    }
}

日志信息

com.vectorx.jpa_spring.service.PersonService$$EnhancerByCGLIB$$2e5519cd
Hibernate: 
    insert 
    into
        JPA_PERSONS
        (age, email, LAST_NAME) 
    values
        (?, ?, ?)
Hibernate: 
    insert 
    into
        JPA_PERSONS
        (age, email, LAST_NAME) 
    values
        (?, ?, ?)

数据表 JPA_PERSONS 数据

修改 PersonService 的 savePerson 方法,模拟异常的发生

personDao.save(p1);
// 模拟异常
int i = 10 / 0;
personDao.save(p2);

再次执行测试类方法,查看日志信息

com.vectorx.jpa_spring.service.PersonService$$EnhancerByCGLIB$$cab2539e
Hibernate: 
    insert 
    into
        JPA_PERSONS
        (age, email, LAST_NAME) 
    values
        (?, ?, ?)

java.lang.ArithmeticException: / by zero

	at com.vectorx.jpa_spring.service.PersonService.savePerson(PersonService.java:26)
	at com.vectorx.jpa_spring.service.PersonService$$FastClassByCGLIB$$5fe473d0.invoke()
	at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:713)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
	at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:262)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:646)
	at com.vectorx.jpa_spring.service.PersonService$$EnhancerByCGLIB$$cab2539e.savePerson()
	at com.vectorx.jpa_spring.JPATest.testPersonService(JPATest.java:46) <25 internal lines>

说明事务生效,符合预期

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/921498.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号