javascript
Spring 3.1和JPA的持久层
1.概述
本教程顯示了如何使用Hibernate作為持久性提供程序使用JPA設(shè)置Spring 。
有關(guān)使用基于Java的配置和項(xiàng)目的基本Maven pom設(shè)置Spring上下文的分步介紹,請(qǐng)參閱本文 。
2. Java的JPA Spring配置
要在Spring項(xiàng)目中使用JPA, 需要設(shè)置EntityManager 。
這是配置的主要部分,它是通過(guò)Spring工廠bean完成的,即更簡(jiǎn)單的LocalEntityManagerFactoryBean或更靈活的LocalContainerEntityManagerFactoryBean 。 此處使用后一個(gè)選項(xiàng),以便可以在其上配置其他屬性:
@Configuration @EnableTransactionManagement public class PersistenceJPAConfig{@Beanpublic 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;}@Beanpublic 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;}@Beanpublic PlatformTransactionManager transactionManager(){JpaTransactionManager transactionManager = new JpaTransactionManager();transactionManager.setEntityManagerFactory(entityManagerFactoryBean().getObject() );return transactionManager;}@Beanpublic 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");}};} }另外,請(qǐng)注意,在Spring 3.2之前, cglib必須位于類路徑中才能使Java @Configuration類起作用。 為了更好地理解cglib作為依賴項(xiàng)的需求,請(qǐng)參閱Spring中有關(guān)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.xsdhttp://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的新配置之間有一個(gè)相對(duì)小的差異–在XML中,對(duì)另一個(gè)bean的引用可以指向該bean或該bean的bean工廠。 但是在Java中,由于類型不同,編譯器不允許這樣做,因此首先從Bean工廠中檢索EntityManagerFactory ,然后將其傳遞給事務(wù)管理器:
txManager.setEntityManagerFactory( this.entityManagerFactoryBean()。getObject() );
4.完全不用XML
通常,JPA通過(guò)META-INF / persistence.xml文件定義一個(gè)持久性單元。 從Spring 3.1開(kāi)始,不再需要persistence.xml - LocalContainerEntityManagerFactoryBean現(xiàn)在支持'packagesToScan'屬性,可以在其中指定要掃描@Entity類的軟件包。
該文件是最后要?jiǎng)h除的XML片段–現(xiàn)在, 無(wú)需使用XML即可完全??設(shè)置JPA。
4.1。 JPA屬性
JPA屬性通常在persistence.xml文件中指定; 或者,可以將屬性直接指定給實(shí)體管理器工廠bean:
factoryBean.setJpaProperties(this.additionalProperties());
附帶說(shuō)明一下,如果Hibernate將是持久性提供程序,則這將是指定Hibernate特定屬性的方式。
5. Maven配置
除了Spring Core和持久性依賴關(guān)系(在Spring with Maven教程中詳細(xì)顯示)之外,我們還需要在項(xiàng)目中定義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>請(qǐng)注意,MySQL依賴項(xiàng)作為參考包括在內(nèi)-需要驅(qū)動(dòng)程序來(lái)配置數(shù)據(jù)源,但是任何受Hibernate支持的數(shù)據(jù)庫(kù)都可以。
六,結(jié)論
本教程說(shuō)明了如何使用XML和Java配置在Spring中使用Hibernate配置JPA 。
我們還討論了如何擺脫通常與JPA相關(guān)聯(lián)的XML的最后一部分– persistence.xml 。 最終結(jié)果是一個(gè)輕量級(jí)的,干凈的DAO實(shí)現(xiàn),幾乎沒(méi)有依賴Spring的編譯時(shí)。
可以在github項(xiàng)目中找到此Spring JPA教程的實(shí)現(xiàn)–這是一個(gè)基于Eclipse的項(xiàng)目,因此應(yīng)該很容易直接導(dǎo)入和運(yùn)行。
翻譯自: https://www.javacodegeeks.com/2011/12/persistence-layer-with-spring-31-and_14.html
總結(jié)
以上是生活随笔為你收集整理的Spring 3.1和JPA的持久层的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 使用ThreadPoolExecutor
- 下一篇: 工行借记卡etc多久扣费?