Jpa 's /META/INF/persistence.xml with transaction-type set "RESOURCE_LOCAL" can be replace in spring configuration.
The demo persistence.xml looks like below.
<?xml version="1.0" encoding="UTF-8"?> <persistence version="2.1" 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"> <persistence-unit name="hibernate-persistence" transaction-type="RESOURCE_LOCAL"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <class>com.shengwang.demo.security.model.UserEntity</class> <class>com.shengwang.demo.security.model.AuthorityEntity</class> <exclude-unlisted-classes>false</exclude-unlisted-classes> <properties> <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" /> <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/spring" /> <property name="javax.persistence.jdbc.user" value="root" /> <property name="javax.persistence.jdbc.password" value="IHave1Dream!" /> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/> <!-- ================================== --> <!-- some optional hibernate properties --> <!-- ================================== --> <property name="hibernate.hbm2ddl.auto" value="create"/> <property name="hibernate.hbm2ddl.import_files" value="insert-data.sql"/> <property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy"/> </properties> </persistence-unit> </persistence>
This xml file can be replace with following spring config.
package com.shengwang.demo; // omit import @Configuration @EnableJpaRepositories(basePackages = "com.shengwang.demo.model") public class RootConfig { @Bean public BasicDataSource dataSource() { // org.apache.commons.dbcp.BasicDataSource BasicDataSource basicDataSource = new BasicDataSource(); basicDataSource.setDriverClassName("com.mysql.jdbc.Driver"); basicDataSource.setUrl("jdbc:mysql://localhost:3306/spring"); basicDataSource.setUsername("root"); basicDataSource.setPassword("IHave1Dream!"); return basicDataSource; } @Bean public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) { LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean(); // entityManagerFactory.setPersistenceUnitName("hibernate-persistence"); entityManagerFactory.setDataSource(dataSource); entityManagerFactory.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); entityManagerFactory.setJpaDialect(new HibernateJpaDialect()); entityManagerFactory.setPackagesToScan("com.shengwang.demo.model"); entityManagerFactory.setJpaPropertyMap(hibernateJpaProperties()); return entityManagerFactory; } private Map<String, ?> hibernateJpaProperties() { HashMap<String, String> properties = new HashMap<>(); properties.put("hibernate.hbm2ddl.auto", "create"); properties.put("hibernate.show_sql", "false"); properties.put("hibernate.format_sql", "false"); properties.put("hibernate.hbm2ddl.import_files", "insert-data.sql"); properties.put("hibernate.ejb.naming_strategy", "org.hibernate.cfg.ImprovedNamingStrategy"); properties.put("hibernate.c3p0.min_size", "2"); properties.put("hibernate.c3p0.max_size", "5"); properties.put("hibernate.c3p0.timeout", "300"); // 5mins return properties; } @Bean public JpaTransactionManager transactionManager(EntityManagerFactory emf) { //org.springframework.orm.jpa.JpaTransactionManager JpaTransactionManager jpaTransactionManager = new JpaTransactionManager(); jpaTransactionManager.setEntityManagerFactory(emf); return jpaTransactionManager; } }
In the java-based config, first define a DataSource bean, then use this data source to create entityManagerFactory, finally use this entityManagerFactory bean to create a transactionManager bean.
Good example, this helped me a lot
ReplyDelete