【问题标题】:NullPointerException at org.hibernate.impl.SessionFactoryImpl.getClassMetadataorg.hibernate.impl.SessionFactoryImpl.getClassMetadata 处的 NullPointerException
【发布时间】:2011-07-02 02:04:30
【问题描述】:

不知道如何表达,因为我不确定什么是空的。

我有一个像这样配置的 hbm.xml 文件: `

<hibernate-mapping package="com.cottage.entity">
    <class name="Reservation" table="reservation" lazy="false">
        <id name="entityId" type="java.lang.Integer" column="reservationId"
            unsaved-value="0">
            <generator class="native">
                <param name="sequence">reservation_id_sequence</param>
            </generator>
        </id>
        <discriminator column="reservationId" insert="false" />

        ...

    </class>
</hibernate-mapping>

`

此 hbm.xml 已正确添加到 hibernate.cfg.xml。

我正在使用BaseDAOImpl &lt;T extends Entity&gt; extends GenericDAOImpl&lt;T, Long&gt; implements BaseDAO&lt;T&gt;。这个 Generic DAO 是 Hibernate-Generic-DAO-framework 中的一个类

更多代码如下:

public abstract class BaseDAOImpl <T extends Entity> extends GenericDAOImpl<T, Long> implements BaseDAO<T> {

@Autowired
@Override
public void setSessionFactory(SessionFactory sessionFactory) {
    super.setSessionFactory(sessionFactory);
}

所以我所有的 DAO 都扩展了这个基类。

我正在使用 spring 进行会话管理。示例 appContext 文件如下:

    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
    xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/util
           http://www.springframework.org/schema/util/spring-util-2.5.xsd
           http://www.springframework.org/schema/tx
           http://www.springframework.org/schema/tx/spring-tx.xsd            
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd ">

    <context:annotation-config />
    <context:component-scan base-package="com.cottage" />
    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${connection.driver_class}" />
        <property name="url" value="${connection.url}" />
        <property name="username" value="${connection.username}" />
        <property name="password" value="${connection.password}" />
    </bean>

    <bean id="sessionFactory" depends-on="liquibase"
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation">
            <value>
                classpath:hibernate.cfg.xml
        </value>
        </property>
        <property name="hibernateProperties">
            <util:property-path path="appSettings.resolvedProps" />
        </property>
    </bean>

    <tx:annotation-driven transaction-manager="transactionManager" />

    <bean id="transactionManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>

    <bean name="openSessionInViewInterceptor"
        class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>

    ...
</beans>

在尝试练习 DAO 的课堂上,我这样称呼它:

@Test
@Transactional
public void getReservationShouldRetrieveAReservationById() {

    final ReservationDAO mockReservationDAO = context.mock(ReservationDAO.class);
    context.checking(new Expectations() {
        {
            oneOf(mockReservationDAO).getReservation(0);
            will(returnValue(reservation1));
        }
    });

    assertNotNull(reservationDAO.getSession());
    Reservation returnedReservation = reservationDAO.getReservation(0);

    ...
}

上述代码的DAO实现为:

@Repository("reservationDAO")
public class HibernateReservationDAOImpl extends BaseDAOImpl<Entity> implements ReservationDAO {

public Reservation getReservation(int reservationId) {
    return (Reservation) searchUniqueByPropertyEqual("entityId", reservationId);
}

}

当它到达那个点时,它会生成以下异常:

java.lang.NullPointerException
at org.hibernate.impl.SessionFactoryImpl.getClassMetadata(SessionFactoryImpl.java:694)
at com.trg.search.hibernate.HibernateMetadataUtil.getUnproxiedClass(HibernateMetadataUtil.java:126)
at com.trg.search.hibernate.HibernateMetadataUtil.get(HibernateMetadataUtil.java:91)
at com.trg.search.hibernate.HibernateMetadataUtil.get(HibernateMetadataUtil.java:103)
at com.trg.search.BaseSearchProcessor.prepareValue(BaseSearchProcessor.java:707)
at com.trg.search.BaseSearchProcessor.filterToQL(BaseSearchProcessor.java:453)
at com.trg.search.BaseSearchProcessor.generateWhereClause(BaseSearchProcessor.java:413)
at com.trg.search.BaseSearchProcessor.generateQL(BaseSearchProcessor.java:111)
at com.trg.search.hibernate.HibernateSearchProcessor.searchUnique(HibernateSearchProcessor.java:196)
at com.trg.dao.hibernate.HibernateBaseDAO._searchUnique(HibernateBaseDAO.java:600)
at com.trg.dao.hibernate.GenericDAOImpl.searchUnique(GenericDAOImpl.java:125)
at com.cottage.dao.hibernate.impl.BaseDAOImpl.searchUniqueByPropertyEqual(BaseDAOImpl.java:36)
at com.cottage.dao.hibernate.impl.HibernateReservationDAOImpl.getReservation(HibernateReservationDAOImpl.java:22)
at com.cottage.dao.hibernate.impl.HibernateReservationDAOTest.getReservationShouldRetrieveAReservationById(HibernateReservationDAOTest.java:63)

我正在使用带有 dbunit 和 spring 测试的 hibernate。正在尝试为我的代码设置测试环境。

关于配置混乱的地方或我错过了什么必要的地方有什么想法吗?

谢谢

【问题讨论】:

  • @skaffman。我正在使用休眠 3.2.5.ga。仅供参考,我正在使用 hibernate-generic-dao 0.5.1。希望这会有所帮助
  • 我在父对象中搜索字符串集合时也遇到了这个问题。我很失望没有看到解决方案。
  • 对不起,我帮不上忙。我实际上不得不删除整个配置并重新开始。对不起

标签: hibernate spring dbunit hibernate-generic-dao


【解决方案1】:

我认为错误的部分是

public class HibernateReservationDAOImpl extends BaseDAOImpl<Entity> implements ReservationDAO

您没有发布 ReservationDAO 的代码,但我认为它类似于

public interface ReservationDAO extends BaseDAO<Entity> {
}

在你的情况下应该是

public class HibernateReservationDAOImpl extends BaseDAOImpl<Reservation> implements ReservationDAO

public interface ReservationDAO extends BaseDAO<Reservation> 

昨天刚遇到类似的问题,我在测试中使用了与您类似的通用 dao 类,并且必须在没有通用的情况下进行实现。所以我认为对于 hibernate-generic-dao 来说,了解它在使用什么类很重要。

【讨论】:

  • 这似乎是正确的答案。这发生在一年前,我现在无法访问它,但你的答案与我当时的做法是同步的(如果我没有阅读你的答案,我会如何再次这样做)。
【解决方案2】:

添加这个作为另一个答案,因为我遇到了完全相同的错误堆栈跟踪。但是我的问题是不同的,我的实体类不在上下文文件中属性“packagesToScan”下指定的包中。确保您的实体类在以下属性下指定的包中。

<property name="dataSource" ref="intDataSource" />
     <property name="packagesToScan">
     <array>
          <value>com.mycompany.bus.server.dao</value>
          <value>com.mycompany.bus.client.dao</value>
     </array>
 </property>  

【讨论】:

    【解决方案3】:

    在 org.hibernate.internal.SessionFactoryImpl.locate EntityPersister(SessionFactoryImpl.java:783)

    当您的typenull 时可能发生:

    private Class<T> type;
    
    entityManager.find(type, entityId);
    

    session.createCriteria(type);
    

    因为您没有在 DAOImpl 中指定类型。 DAOImpl 类中的构造函数可以解决问题:

    public ExampleClassDAOImpl() {
        super(ExampleClass.class);
    }
    

    【讨论】:

      猜你喜欢
      • 2013-04-19
      • 2019-06-28
      • 2015-04-12
      • 2015-01-13
      • 2015-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-21
      相关资源
      最近更新 更多