基于Spring & Maven 搭建JPA的项目

创建Maven项目的原因: 方便管理jar包依赖,项目中需要使用的jar包只需要在pom.xml文件中配置即可。不要再把jar包复制到项目中,然后右键项目 config build path。

基于Spring创建项目的原因:可以使用Spring的容器管理和java配置 这里全部使用Java配置,只需要创建一个Java配置类即可,创建一个类 加上 @Configuration 等注解即可。

参考  Spring&JPA    数据库的总篇&配置数据源

具体操作

1.创建一个maven项目  选择 maven-archetype-quickstart即可。

2.在Spring应用上下文中(Spring的配置类)配置实体管理器工厂

2.1 配置DataSource数据源 ---oracle数据库

 
import javax.sql.DataSource;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
@Bean
public DataSource dataSource() {
	DriverManagerDataSource dataSource = new DriverManagerDataSource();
	dataSource.setDriverClassName("oracle.jdbc.driver.OracleDriver");
	dataSource.setUrl("jdbc:oracle:thin:@172.1.0.0:1521:orcl");
	dataSource.setUsername("admin");
	dataSource.setPassword("123");
	return dataSource;
}

 2.1 配置DataSource数据源 ----mysql数据库

这里setUrl方法里需要指定数据库的名字,否则会报错 java.sql.SQLException: No database selected

参考 java.sql.SQLException: No database selected

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

 

 2.2 配置JpaVendorAdapter:Spring提供了多个JPA厂商适配器:EclipseLinkJpaVendorAdapter;HibernateJpaVendorAdapter;OpenJpaVendorAdapter等,如果选用Hibernate作为JPA的实现,需要配置HibernateJpaVendorAdapter。

import org.springframework.context.annotation.Bean;
import org.springframework.orm.jpa.JpaVendorAdapter;
import org.springframework.orm.jpa.vendor.Database;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
 
@Bean
public JpaVendorAdapter jpaVendorAdapter() {
	HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter();
	// 设置数据库类型
	jpaVendorAdapter.setDatabase(Database.ORACLE);
	jpaVendorAdapter.setShowSql(true);
	jpaVendorAdapter.setGenerateDdl(false);
	// 设置数据库方言
	jpaVendorAdapter.setDatabasePlatform("org.hibernate.dialect.Oracle10gDialect");
	return jpaVendorAdapter;
}

这里要注意 使用哪种数据库,就设置哪种数据库方言

如果是用mysql数据库,却设置了oracle数据库方言,就会报错

    com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'portal.hibernate_sequence' doesn't exist,  

mysql数据库应该设置方言 

	jpaVendorAdapter.setDatabasePlatform("org.hibernate.dialect.MySQL57InnoDBDialect");

参考 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'portal.hibernate_sequence' doesn't exist, 谈谈主键自增的方式

2.3配置EntityManagerFactory需要两个参数 DataSource 和 JpaVendorAdapter 

import javax.sql.DataSource;
import org.springframework.orm.jpa.JpaVendorAdapter;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
 
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource,
		JpaVendorAdapter jpaVendorAdapter) {
	LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean();
	//设置数据源
	entityManagerFactory.setDataSource(dataSource);
	//设置JPA厂商适配器
	entityManagerFactory.setJpaVendorAdapter(jpaVendorAdapter);
	//设置扫描的基础包查找 带有@Entity注解的类 
	//这个包下带有@Entity @Table注解的类会在数据库里自动建表
	entityManagerFactory.setPackagesToScan("com.xxx.entity");
	return entityManagerFactory;
}

这里要非常注意的是       entityManagerFactory.setPackagesToScan("com.xxx.entity"); 这句要改成自己项目中希望扫描的包,这个包及其子包下的带有@Entity 和 @Table注解的类  在jpa启动事,会在数据库自动建表。 

这个和Spring 配置类上的@ComponentScan不一样,Spring 配置类上的@ComponentScan 注解事扫描包,发现@Entity,@Service @Controller @Component注解的类,并把这些类配置为Spring容器管理的Bean.

所以这两个是完全不同。 别搞混了!!!!

如果  entityManagerFactory.setPackagesToScan("com.xxx.entity"); 设置不正确,在em.persist() 操作时,会一直报错 

java.lang.IllegalArgumentException: Unknown entity: com.mx.JpaDemo.entity.Student

       at org.hibernate.jpa.spi.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:1149)

3.在测试类中 使用JPA来实现增删改查等

以上配置完成后,就可以在项目中使用 @PersistenceContext 来注入 实体管理器   EntityManager em;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.jpaDemo.config.JpaConfig;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = JpaConfig.class)
public class JpaDemoTest {
	@PersistenceContext
	private EntityManager em;

	@Test
	public void testaddSolrListIndex() {

		String sql = "select * from t_student t where t.id = 22";
		Query query = em.createNativeQuery(sql);
		List objecArraytList = query.getResultList();
		//continue

	}

}

 

posted on 2019-07-18 10:52  dreamstar  阅读(309)  评论(0编辑  收藏  举报