6

提供されたマッピングに基づいて自動的に作成されるメモリデータベースで実行するようにSpring環境をセットアップしようとしています。実行中、ログでDDLステートメントが実行されていることがわかりますが、hibernateが作成されたテーブルにデータを挿入しようとすると、「テーブルが見つかりません」という例外が発生します。

何が問題になる可能性がありますか?

Spring3.1.1とHibernate4.1.1およびH2バージョン1.3.165を使用します。

ログは次のようになります(関連するレコードのみが残っています):

INFO at '25-04-2012 13:23:56.318' by thread 'main' from category 'org.hibernate.tool.hbm2ddl.SchemaExport':
HHH000227: Running hbm2ddl schema export
DEBUG at '25-04-2012 13:23:56.318' by thread 'main' from category 'org.hibernate.SQL':

    drop table DUMMIES if exists
Hibernate: 
    drop table DUMMIES if exists
DEBUG at '25-04-2012 13:23:56.318' by thread 'main' from category 'org.hibernate.SQL':

    create table DUMMIES (
        id bigint generated by default as identity,
        title varchar(255),
        primary key (id),
        unique (title)
    )
Hibernate: 
    create table DUMMIES (
        id bigint generated by default as identity,
        title varchar(255),
        primary key (id),
        unique (title)
    )
INFO at '25-04-2012 13:23:56.334' by thread 'main' from category 'org.hibernate.tool.hbm2ddl.SchemaExport':
HHH000230: Schema export complete
INFO at '25-04-2012 13:23:56.334' by thread 'main' from category 'org.springframework.context.support.ClassPathXmlApplicationContext':
Bean 'mySessionFactory' of type [class org.springframework.orm.hibernate4.LocalSessionFactoryBean] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
INFO at '25-04-2012 13:23:56.631' by thread 'main' from category 'org.springframework.orm.hibernate4.HibernateTransactionManager':
Using DataSource [org.springframework.jdbc.datasource.SimpleDriverDataSource@a86d12] of Hibernate SessionFactory for HibernateTransactionManager
WARN at '25-04-2012 13:23:56.865' by thread 'main' from category 'org.hibernate.engine.jdbc.spi.SqlExceptionHelper':
SQL Error: 42102, SQLState: 42S02
ERROR at '25-04-2012 13:23:56.865' by thread 'main' from category 'org.hibernate.engine.jdbc.spi.SqlExceptionHelper':
Table "DUMMIES" not found; SQL statement:
insert into DUMMIES (id, title) values (null, ?) [42102-165]

Beans.xmlは次のようになります(「mypackage」は完全なパッケージ名の代わりです):

<bean id="myDataSource"
    class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
    <property name="driverClass" value="org.h2.Driver" />
    <property name="url" value="jdbc:h2:mem:" />
    ...
</bean>

<bean id="mySessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="myDataSource" />
    <property name="packagesToScan">
        <array>
            <value>mypackage.entities</value>
        </array>
    </property>
</bean>

<bean id="myTransactionManager"
    class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="mySessionFactory" />
</bean>

<aop:config>
    <aop:pointcut id="daoMethods" expression="execution(* mypackage.*Dao.*(..))" />
    <aop:advisor advice-ref="requiredTxAdvice" pointcut-ref="daoMethods" />
</aop:config>

<tx:advice id="requiredTxAdvice" transaction-manager="myTransactionManager">
    <tx:attributes>
        <tx:method name="*" propagation="REQUIRED" />
    </tx:attributes>
</tx:advice>

class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />
<bean id="dummyDao" class="mypackage.DummyDaoImpl">
    <property name="sessionFactory" ref="mySessionFactory" />
</bean>

hibernate.propertiesは次のようになります:

hibernate.dialect=org.hibernate.dialect.H2Dialect
hibernate.show_sql=true
hibernate.format_sql=true
hibernate.id.new_generator_mappings=true
hibernate.hbm2ddl.auto=create-drop

(作成も機能しません)

4

1 に答える 1

9

H2が接続ごとに新しいデータベースを作成するときにデータベースURLを指定するjdbc:h2:mem:と、各Hibernateセッションは独自の空のデータベースを認識します。

したがって、異なる接続から同じデータベースにアクセスするには、データベース名を指定する必要があります。また、アクティブな接続がないときにデータベースが閉じられないようにする必要があります。結果のURLは次のようになりますjdbc:h2:mem:foo;DB_CLOSE_DELAY=-1

また、Springは組み込みデータベースの組み込みサポートを提供していることに注意してください。12.8組み込みデータベースのサポートを参照してください。

于 2012-04-25T11:20:55.500 に答える