3

何がヌルかわからないので、これをどのように表現するかさえわかりません。

次のように構成された 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 <T extends Entity> extends GenericDAOImpl<T, Long> implements BaseDAO<T>ます。この 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 はこの基本クラスを拡張します。

セッション管理に春を使用しています。以下のサンプル 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 と春のテストで休止状態を使用しています。コードのテスト環境をセットアップしようとしています。

構成がめちゃくちゃになっている場所や、必須の何かを見逃した場所についてのアイデアはありますか?

ありがとう

4

3 に答える 3

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 は、どのクラスで動作しているかを知ることが重要だと思います。

于 2012-07-11T07:26:38.590 に答える
0

まったく同じエラースタックトレースに遭遇したため、これを別の回答として追加しました。しかし、私の場合の問題は異なりました.私のEntityクラスは、コンテキストファイルのプロパティ「packagesToScan」で指定されたパッケージにありませんでした。以下のプロパティで指定されたパッケージの Entity クラスを確認してください。

<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>  
于 2015-01-11T18:41:50.253 に答える
0

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

次の場合に発生する可能性がありtypeますnull

private Class<T> type;

entityManager.find(type, entityId);

また

session.createCriteria(type);

DAOImpl で型を指定していないためです。DAOImpl クラスのコンストラクターで問題を解決できます。

public ExampleClassDAOImpl() {
    super(ExampleClass.class);
}
于 2017-02-07T16:19:46.673 に答える