java - XMLless JPA 2.1 中 EntityManager 为 null

标签 java spring hibernate maven jpa

我正在从 Hibernate 迁移到 JPA 2.1,我遵循了此 tutorial ,创建一个没有 persistence.xml 的 JPA 配置

但是当Tomcat启动时EntityManager为空。

我的所有实体都用 @Entity 进行注释。

这是我的 applicationContext.xml:

<context:component-scan
        base-package="br.com.foo, br.com.bar"/>

<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
  <property name="entityManagerFactory" ref="entityManagerFactoryBean" />
</bean>
<tx:annotation-driven/>

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  <property name="driverClassName" value="com.mysql.jdbc.Driver" />
  <property name="url" value="jdbc:mysql://localhost:3306/myDb" />
  <property name="username" value="root" />
  <property name="password" value="root" />
</bean>

<bean id="entityManagerFactoryBean" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
  <property name="dataSource" ref="dataSource" />
  <property name="packagesToScan" value="br.com.foo.persistence" />
  <property name="jpaVendorAdapter">
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
  </property>
<property name="jpaProperties">
     <props>
        <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
     </props>
  </property>
</bean>
...

GenericDAO,所有其他 DAO 都继承自它:

package br.com.bar;

@Repository
@Transactional
public abstract class GenericDAOImpl<Entity> implements GenericDAO<Entity> {

@PersistenceContext
private EntityManager manager;

protected SessionFactory sessionFactory;

public GenericDAOImpl() {
  this.sessionFactory = manager.unwrap(SessionFactory.class); //this line throws NullPointerException
}
...

实体:

package br.com.foo.persistence;

@Entity
@Table(name = "USER")
@Inheritance(strategy = InheritanceType.JOINED)
public class User extends BaseEntity {

private static final long serialVersionUID = 3966629079539419005L;

  @Column(name = "NAME", length = 200)
  private String name;

pom.xml

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>${hibernate.version}</version>
        <type>jar</type>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.hibernate.javax.persistence</groupId>
        <artifactId>hibernate-jpa-2.1-api</artifactId>
        <version>1.0.0.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>${hibernate.version}</version>
        <type>jar</type>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>4.2.0.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate.common</groupId>
        <artifactId>hibernate-commons-annotations</artifactId>
        <version>4.0.1.Final</version>
        <classifier>tests</classifier>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-c3p0</artifactId>
        <version>3.3.1.GA</version>
    </dependency>

错误的堆栈跟踪:

GRAVE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'companyDAOImpl' defined in file [C:\Users\marcelo\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\evcash-core\WEB-INF\classes\br\com\foo\CompanyDAOImpl.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [br.com.foo.dao.CompanyDAOImpl]: Constructor threw exception; nested exception is java.lang.NullPointerException
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1110)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1055)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:751)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:861)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:541)
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:444)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:326)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4939)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5434)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [br.com.bar.dao.CompanyDAOImpl]: Constructor threw exception; nested exception is java.lang.NullPointerException
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:154)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:89)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1103)
... 22 more
Caused by: java.lang.NullPointerException
at br.com.bar.dao.impl.GenericDAOImpl.<init>(GenericDAOImpl.java:39)
at br.com.foo.dao.CompanyDAOImpl.<init>(CompanyDAOImpl.java:19)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:142)
... 24 more

CompanyDAOImpl:

package br.com.foo.dao;

@Repository
public class CompanyDAOImpl
    extends GenericDAOImpl<Company>
    implements CompanyDAO{

@Override
protected Class<Company> getClazz() {
  return Company.class;
}
...

最佳答案

EntityManager manager 的实例未在构造函数内定义。 Spring injects the dependencies after the object is instantiated .

关于java - XMLless JPA 2.1 中 EntityManager 为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41597424/

相关文章:

spring - Kotlin Spring Boot 中的 Controller 验证

java - 如何从通用类创建 BeanPropertyRowMapper?

java - hibernate 4 : ViolatedConstraintNameExtracter exception

java - 编写具有多个子元素限制的 Hibernate Criteria API 查询

java - Eclipse Design Tab 检测到错误的 Java

java - 用多行遍历 String

java -/api-url 在 Spring Boot Security 中有一个空的过滤器列表

java - 构造一个具有特定值的HashMap

java - Spring Security 在运行时注销用户

java - Hibernate 和 MySQL 抛出 : check the manual that corresponds to your MySQL server version for the right syntax to use near 'Show'