在我的J2EE应用程序中,我尝试使用spring boot和JPA技术,并将EntityManager注入DAO层。然而,我有一些问题。。。我的用户CRUD存储库:
@Repository
public class UserRepositoryImpl implements UserRepository {
@PersistenceContext(unitName = "data")
private EntityManager entityManager;
// and crud methods
}
我的spring boot应用程序类:
@SpringBootApplication
public class App {
public static void main(String [] args) {
SpringApplication.run(App.class, args);
}
}
最后是我的坚持。xml,位于src/main/resources/META-INF文件夹中:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="data" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<class>com.example.domain.User</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<property name="hibernate.connection.autocommit" value="false" />
<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect" />
<property name="hibernate.c3p0.min_size" value="4" />
<property name="hibernate.c3p0.max_size" value="128" />
<property name="javax.persistence.jdbc.url" value="jdbc:sqlserver://localhost:1433;databaseName=qwerty;sendStringParametersAsUnicode=false" />
<property name="javax.persistence.jdbc.user" value="sa" />
<property name="javax.persistence.jdbc.driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />
<property name="javax.persistence.jdbc.password" value="" />
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.show_sql" value="false" />
</properties>
</persistence-unit>
所以,当我尝试使用这个注入的entityManager时,我得到了NullPointerException。其他@Autowired字段被注入,没有任何问题。这个代码怎么了?我需要一些额外的配置吗?我是一个初学者(甚至不是初级开发人员),我确实对Spring boot是什么以及如何配置它有一些误解,就像xml文件中的Spring一样。如果由于注入EM而需要这样的xml配置,请演示如何进行。
upd2。依赖项
<dependencies>
<!-- logger -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<!-- db -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-c3p0</artifactId>
</dependency>
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
</dependency>
<dependency>
<groupId>com.microsoft</groupId>
<artifactId>sqljdbc4</artifactId>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.5.3</version>
</dependency>
<!-- csv -->
<dependency>
<groupId>com.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>3.3</version>
</dependency>
<!-- spring-boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>1.2.4.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
<version>1.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.1.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>1.2.4.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
如果您使用以下命令,那么请求EntityManager的类应该是Springbean
public class Foo {
@PersistenceContext
private EntityManager entityManager;
}
在这里,如果您使用new关键字来获取上面Foo类的实例,那么EntityManager将为空。
希望这对某人有帮助!
您可以使用java配置来配置jpa持久性。下面的代码向您展示了配置示例:
@Component
public class JpaConfiguration {
@Bean
@Primary
public DataSource dataSource() {
final SimpleDriverDataSource dataSource = new SimpleDriverDataSource();
dataSource.setDriver(new org.postgresql.Driver());
dataSource.setUrl("jdbc:postgresql://localhost:5432/users");
dataSource.setUsername("postgres");
dataSource.setPassword("admin");
return dataSource;
}
@Bean
public JpaVendorAdapter jpaVendorAdapter() {
HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter();
jpaVendorAdapter.setGenerateDdl(true);
jpaVendorAdapter.setShowSql(true);
jpaVendorAdapter.setDatabasePlatform("org.hibernate.dialect.PostgreSQLDialect");
return jpaVendorAdapter;
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean lef = new LocalContainerEntityManagerFactoryBean();
lef.setPackagesToScan("tn.bergit.crud.entity");
lef.setDataSource(dataSource());
lef.setJpaVendorAdapter(jpaVendorAdapter());
Properties properties = new Properties();
properties.setProperty("hibernate.show_sql", "true");
properties.setProperty("hibernate.jdbc.fetch_size", "100");
properties.setProperty("hibernate.hbm2ddl.auto", "update");
lef.setJpaProperties(properties);
return lef;
}
}
你可以在github上看到这个例子(点击这里)
您应该使用spring boot starter数据jpa的依赖关系
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
要使用持久性xml,您应该按照文档中的说明定义bean。
Spring不需要使用XML来配置JPA提供程序,Spring Boot假设您想利用该功能。如果您更喜欢使用persistence.xml那么您需要定义自己的@Bean,类型为LocalEntityManagerFactoryBean(id为'entityManagerFactory',并在那里设置持久性单元名称。
http://docs.spring.io/spring-boot/docs/current/reference/html/howto-data-access.html#howto-使用传统的持久性xml
或者可以完全跳过persistence.xml,在application.properties文件中定义连接属性。
引用文档
DataSource配置由spring.datasource.*中的外部配置属性控制。例如,您可以在application.properties中声明以下部分:
spring.datasource.url=jdbc:mysql://localhost/test
spring.datasource.username=dbuser
spring.datasource.password=dbpass
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-sql.html#boot-功能连接到生产数据库
(更改驱动程序和其他数据以匹配您的环境)
祝你好运!
我试图使用-@runwith(SpringJUnit4ClassRunner.class)@ContextConfiguration({“classpath:some.xml”})运行spring JUnit测试用例 xml在内存db详细信息中定义了bean
我已经尝试将我的应用程序部署到Tomcat 6与Metro/泽西和Glassfish 3.1.2,但是访问WebServiceContext资源总是会导致空指针异常,除非我使用自动生成的Glassfish测试门户测试应用程序。 下面是我写的一个简单的测试方法来验证这一点: 下面是相应的web-xml(主要由Eclipse自动生成): 最有趣的是,当我通过访问Glassfish生成的URL来测试Te
我做了一些搜索,但我无法找出是什么问题。我知道这个问题来自于ClassNotFoundException,但我无法解决它。 我把我需要的东西都装上了(嗯,我想)。下面是我的代码: DAO类: 服务类别:
Spring版本:3.2.4.版本和3.2.9.版本 Mockito版本:1.8.5 我一直在尝试将H2测试引入到一个老项目的集成测试中,并且遇到了一些问题。由于事务传播的方式,我需要模拟一个自动连接的类。我以前这样做过,但是现在遇到了严重的问题。初始化测试时会引发以下错误信息: org.springframework.beans.factory.BeanCreationException:创建名
在启动springboot应用程序时出现了一些异常。我不知道我错过了什么。 这里是我的代码:这是入口: 这是控制器: 这是pom.xml 这是日志(对格式抱歉): 问题已经修复,我更新了ContextConfig.class,如下所示:` `