基于Spring & Maven 搭建JPA的项目
创建Maven项目的原因: 方便管理jar包依赖,项目中需要使用的jar包只需要在pom.xml文件中配置即可。不要再把jar包复制到项目中,然后右键项目 config build path。
基于Spring创建项目的原因:可以使用Spring的容器管理和java配置 这里全部使用Java配置,只需要创建一个Java配置类即可,创建一个类 加上 @Configuration 等注解即可。
具体操作
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");
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
}
}