spring-data-jpa学习(一)环境配置1.3

本文介绍了Spring Data JPA的学习,重点是环境配置,包括DataSource的配置和JPA的基础知识。讲解了JPA的两种实体管理器类型——应用程序管理型和容器管理型,以及如何在Spring中配置它们。还提到了事务管理,使用的是JPA的事务管理器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

3.PersistenceConfig.class

package test.persistence;

@Configuration
@ComponentScan(basePackages = "test.persistence")
@EnableTransactionManagement
@EnableJpaRepositories("test.persistence.repository")
@PropertySource(value = { "classpath:/META-INF/db.properties" })
public class PersistenceConfig {

	private DataSource preferentialDataSource;

	private static final String PROPERTY_NAME_DATABASE_DRIVER = "connection.driver_class";
	private static final String PROPERTY_NAME_DATABASE_URL = "connection.url";
	private static final String PROPERTY_NAME_DATABASE_USERNAME = "connection.username";
	private static final String PROPERTY_NAME_DATABASE_PASSWORD = "connection.password";
	private static final String PROPERTY_NAME_DATABASE_DDL="hbm2ddl.auto";

	private static final String ENTITY_PACKAGE = "test.persistence.model";

	@Autowired
	private Environment environment;

	private EntityManager entityManager;

	protected LocalContainerEntityManagerFactoryBean entityManagerFactory;
	
	private PlatformTransactionManager annotationDrivenTransactionManager;

	@Bean(name="entityManagerFactory")
	public synchronized LocalContainerEntityManagerFactoryBean getEntityManager() {
		if (this.entityManagerFactory == null) {
			LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
			HibernateJpaVendorAdapter hibernateJpaVendorAdapter=new HibernateJpaVendorAdapter();
			hibernateJpaVendorAdapter.setGenerateDdl(true);
			hibernateJpaVendorAdapter.setShowSql(true);
			factoryBean.setJpaVendorAdapter(hibernateJpaVendorAdapter);
			factoryBean.setDataSource(this.getPreferentialDataSource());
			final Properties jpaProperties = new Properties();
			jpaProperties.put(PROPERTY_NAME_DATABASE_DDL, this.environment.getRequiredProperty(PROPERTY_NAME_DATABASE_DDL));
			factoryBean.setJpaProperties(jpaProperties);
			factoryBean.setPackagesToScan(ENTITY_PACKAGE);
			this.entityManagerFactory = factoryBean;
		}
		return this.entityManagerFactory;
	}

	//事务管理
	@Bean(name = "transactionManager")
	public synchronized PlatformTransactionManager annotationDrivenTransactionManager() {
		if (this.annotationDrivenTransactionManager == null) {
			final JpaTransactionManager jpaTxManager = new JpaTransactionManager();
			jpaTxManager.setEntityManagerFactory(this.entityManagerFactory
					.getNativeEntityManagerFactory());
			jpaTxManager.setJpaDialect(new EclipseLinkJpaDialect());
			this.annotationDrivenTransactionManager = jpaTxManager;
		}
		return this.annotationDrivenTransactionManager;
	}

	@Bean(destroyMethod = "close")
	public synchronized DataSource getPreferentialDataSource() {
		if (this.preferentialDataSource == null) {
			final HikariConfig dataSourceConfig = new HikariConfig();
			dataSourceConfig.setDriverClassName(this.environment
					.getRequiredProperty(PROPERTY_NAME_DATABASE_DRIVER));
			dataSourceConfig.setJdbcUrl(this.environment
					.getRequiredProperty(PROPERTY_NAME_DATABASE_URL));
			dataSourceConfig.setUsername(this.environment
					.getRequiredProperty(PROPERTY_NAME_DATABASE_USERNAME));
			dataSourceConfig.setPassword(this.environment
					.getRequiredProperty(PROPERTY_NAME_DATABASE_PASSWORD));
			this.preferentialDataSource = new HikariDataSource(dataSourceConfig);
		}
		return this.preferentialDataSource;
	}

	@Bean
	@Primary
	public synchronized EntityManager entityManager() {
		if (this.entityManager == null) {
			this.entityManager = SharedEntityManagerCreator
					.createSharedEntityManager(this.entityManagerFactory
							.getNativeEntityManagerFactory());
		}
		return this.entityManager;
	}

	@Bean
	public JdbcTemplate jdbcTemplate() throws SQLException {
		return new JdbcTemplate(this.getPreferentialDataSource());
	}

	@Bean
	public NamedParameterJdbcTemplate namedParameterJdbcTemplate()
			throws SQLException {
		return new NamedParameterJdbcTemplate(this.getPreferentialDataSource());
	}

}

工程混合jdbc和jpa使用,这里既配置了jdbc,也配置了jpa,并且进行了事务管理。

DataSource的配置是公用的,jdbc和jpa都要用到它,jdbcTemplate和NamedParameterJdbcTemplate都是用于jdbc连接的,jdbc是一种比较古老的方式了,这里简单学习一下jpa配置的基础知识。

JPA定义了两种类型的实体管理器,分别是应用程序管理类型和容器管理类型。

1.应用程序管理类型

应用程序管理类型的管理器需要在persistence.xml中进行配置,并用LocalEntityManagerFactoryBean来注入,例如,

在persistence.xml中配置基础信息


在spring中注入LocalEntityManagerFactoryBean



2.容器管理类型

容器管理类型的JPA不需要配置persistence.xml了,而是使用LocalContainerEntityManagerFactoryBean来创建entitymanager。它的注入也很简单,只需指明datasource和jpavendoradapter即可。


创建好EntityManagerFactory之后就可以创建EntityManager啦。


事务管理也有很多方式实现,这里使用了JPA的事务管理器


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值