Spring 3.1和JPA的持久层

1.概述

本教程显示了如何使用Hibernate作为持久性提供程序使用JPA设置Spring

有关使用基于Java的配置和项目的基本Maven pom设置Spring上下文的分步介绍,请参阅本文

2. Java的JPA Spring配置

要在Spring项目中使用JPA, 需要设置EntityManager

这是配置的主要部分,它是通过Spring工厂bean完成的,即更简单的LocalEntityManagerFactoryBean更灵活的LocalContainerEntityManagerFactoryBean 。 此处使用后一个选项,以便可以在其上配置其他属性:

@Configuration
@EnableTransactionManagement
public class PersistenceJPAConfig{

   @Bean
   public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean() {
      LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
      em.setDataSource(dataSource());
      em.setPackagesToScan(new String[] { "org.baeldung.persistence.model" });

      JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
      em.setJpaVendorAdapter(vendorAdapter);
      em.setJpaProperties(additionalProperties());

      return em;
   }

   @Bean
   public DataSource dataSource(){
      DriverManagerDataSource dataSource = new DriverManagerDataSource();
      dataSource.setDriverClassName("com.mysql.jdbc.Driver");
      dataSource.setUrl("jdbc:mysql://localhost:3306/spring_jpa");
      dataSource.setUsername( "tutorialuser" );
      dataSource.setPassword( "tutorialmy5ql" );
      return dataSource;
   }

   @Bean
   public PlatformTransactionManager transactionManager(){
      JpaTransactionManager transactionManager = new JpaTransactionManager();
      transactionManager.setEntityManagerFactory(
       entityManagerFactoryBean().getObject() );

      return transactionManager;
   }

   @Bean
   public PersistenceExceptionTranslationPostProcessor exceptionTranslation(){
      return new PersistenceExceptionTranslationPostProcessor();
   }

   Properties additionalProperties() {
      return new Properties() {
         {  // Hibernate Specific: 
            setProperty("hibernate.hbm2ddl.auto", "create-drop");
            setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
         }
      };
   }
}

另外,请注意,在Spring 3.2之前, cglib必须位于类路径中才能使Java @Configuration类起作用。 为了更好地理解cglib作为依赖项的需求,请参阅Spring中有关cglib工件的讨论

3.使用XML的JPA Spring配置

与XML相同的Spring配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" 
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
   xmlns:tx="http://www.springframework.org/schema/tx"
   xsi:schemaLocation="
      http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
      http://www.springframework.org/schema/tx 
      http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">

   <bean id="myEmf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
      <property name="dataSource" ref="dataSource" />
      <property name="packagesToScan" value="org.baeldung.persistence.model" />
      <property name="jpaVendorAdapter">
         <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
      </property>
      <property name="jpaProperties">
         <props>
            <prop key="hibernate.hbm2ddl.auto">create-drop</prop>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
         </props>
      </property>
   </bean>

   <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
      <property name="driverClassName" value="com.mysql.jdbc.Driver" />
      <property name="url" value="jdbc:mysql://localhost:3306/spring_jpa" />
      <property name="username" value="tutorialuser" />
      <property name="password" value="tutorialmy5ql" />
   </bean>

   <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
      <property name="entityManagerFactory" ref="myEmf" />
   </bean>
   <tx:annotation-driven />

   <bean id="persistenceExceptionTranslationPostProcessor" 
      class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />

</beans>

在XML中配置Spring和基于Java的新配置之间有一个相对小的差异–在XML中,对另一个bean的引用可以指向该bean或该bean的bean工厂。 但是在Java中,由于类型不同,编译器不允许这样做,因此首先从Bean工厂中检索EntityManagerFactory ,然后将其传递给事务管理器:

txManager.setEntityManagerFactory( this.entityManagerFactoryBean()。getObject() );

4.完全不用XML

通常,JPA通过META-INF / persistence.xml文件定义一个持久性单元。 从Spring 3.1开始,不再需要persistence.xml - LocalContainerEntityManagerFactoryBean现在支持'packagesToScan'属性,可以在其中指定要扫描@Entity类的软件包。

该文件是最后要删除的XML片段–现在, 无需使用XML即可完全​​设置JPA。

4.1。 JPA属性

JPA属性通常在persistence.xml文件中指定; 或者,可以将属性直接指定给实体管理器工厂bean:

factoryBean.setJpaProperties(this.additionalProperties());

附带说明一下,如果Hibernate将是持久性提供程序,则这将是指定Hibernate特定属性的方式。

5. Maven配置

除了Spring Core和持久性依赖关系(在Spring with Maven教程中详细显示)之外,我们还需要在项目中定义JPA和Hibernate,以及MySQL连接器

<dependency>
   <groupId>org.hibernate</groupId>
   <artifactId>hibernate-entitymanager</artifactId>
   <version>4.2.4.Final</version>
   <scope>runtime</scope>
</dependency>

<dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
   <version>5.1.26</version>
   <scope>runtime</scope>
</dependency>

请注意,MySQL依赖项作为参考包括在内-需要驱动程序来配置数据源,但是任何受Hibernate支持的数据库都可以。

六,结论

本教程说明了如何使用XML和Java配置在Spring中使用Hibernate配置JPA

我们还讨论了如何摆脱通常与JPA相关联的XML的最后一部分– persistence.xml 。 最终结果是一个轻量级的,干净的DAO实现,几乎没有依赖Spring的编译时。

可以在github项目中找到此Spring JPA教程的实现–这是一个基于Eclipse的项目,因此应该很容易直接导入和运行。

参考: Baeldung博客中的Spring 3和JPA与Hibernate的 合作,来自我们的JCG合作伙伴 Eugen Paraschiv。

翻译自: https://www.javacodegeeks.com/2011/12/persistence-layer-with-spring-31-and_14.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值