5

組み込みデータベースは初めてですが、少なくとも実行できました。私を混乱させるのは、データが実行間で保存されないことです。つまり、テストには適していませんか?アプリケーションを実行するたびにデータベースにデータを追加したくない

だから私はこれを行う方法を探しました、そして私はこのように試した休止状態の接続URLを設定しなければならないことがわかりました

props.put("hibernate.connection.url", "jdbc:h2:~/test");

私のHibernateConfiguration.javaで。成功しなくても、エラーは発生せず、何も保存されず、その URL から作成する必要があるテスト ファイルが見つかりませんでした。(Windowsを実行し、ユーザーフォルダーを確認しました)

私はまた、このようにすることが可能であることを見ました

<jdbc:embedded-database id="dataSource" type="H2">
    <jdbc:script location="classpath:db-schema.sql"/>
    <jdbc:script location="classpath:db-test-data.sql"/>
</jdbc:embedded-database>

アプリケーションを実行するたびにスクリプトを実行しますが、休止状態でテーブルなどの作成をすべて処理する必要があります。

これは通常どのように行われますか?

数時間探しましたが、まだ見つかりません。

Ps。必要な場合は、すべての構成を投稿します。

編集: 私の質問を更新して、1つの質問に焦点を当て、構成を含めました。

HibernateConfiguration.java パッケージ com.courseinfo.project;

import java.util.Properties;

import javax.sql.DataSource;

import org.hibernate.dialect.H2Dialect;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.orm.hibernate3.HibernateTransactionManager;
import org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean;

import com.courseinfo.project.model.Course;

@Configuration
public class HibernateConfiguration {

    @Value("#{dataSource}")
    private DataSource dataSource;

    @Bean
    public AnnotationSessionFactoryBean sessionFactoryBean() {
        Properties props = new Properties();
        props.put("hibernate.dialect", H2Dialect.class.getName());
        props.put("hibernate.format_sql", "true");
        props.put("hibernate.connection.url", "jdbc:h2:~/test");

        AnnotationSessionFactoryBean bean = new AnnotationSessionFactoryBean();
        bean.setAnnotatedClasses(new Class[]{Course.class});        
        bean.setHibernateProperties(props);
        bean.setDataSource(this.dataSource);
        bean.setSchemaUpdate(true);
        return bean;
    }

    @Bean
    public HibernateTransactionManager transactionManager() {
        return new HibernateTransactionManager( sessionFactoryBean().getObject() );
    }

}

埋め込みデータベース タグのみを追加した servlet-context.xml 。

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:beans="http://www.springframework.org/schema/beans"
    xmlns:jdbc="http://www.springframework.org/schema/jdbc"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/jdbc
        http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd"
        default-lazy-init="true">

    <!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->

    <!-- Enables the Spring MVC @Controller programming model -->
    <annotation-driven />

    <!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
    <resources mapping="/resources/**" location="/resources/" />

    <!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
    <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <beans:property name="prefix" value="/WEB-INF/views/" />
        <beans:property name="suffix" value=".jsp" />
    </beans:bean>

    <context:component-scan base-package="com.courseinfo.project" />


    <jdbc:embedded-database id="dataSource" type="H2"/>


</beans:beans>

もちろん、すべての依存関係を取得した pom もありますが、それは必要ないと思います。

オブジェクト (Course.java) を作成し、それを db に保存しています。問題なく、再度読み込むことができます。しかし、コードを変更してアプリケーションをリロードすると、オブジェクトはもう存在しません。

Edit2 : このようなデータを追加しています。

セッション ファクトリのバインド。

@Autowired
private SessionFactory sessionFactory;

このように my Course オブジェクトをデータベースに追加します。

Course course = new Course();
course.setCourseId("IDA512");
Session s = sessionFactory.openSession();
s.saveOrUpdate(course);
s.flush();
s.clear();
Course course2 = (Course) s.get(Course.class, "IDA511");
s.close();

これはうまく機能し、そのコースを取得できます。ただし、次回アプリケーションを実行すると、id IDA511 のコースがなく、null ポインター例外が発生します。これは、コースがセッションでのみ保存されることを意味しますか? ハム

4

1 に答える 1

0

アプリケーションを Windows で実行しているため、チルダ '~' 演算子を使用してもホーム ディレクトリが見つからない可能性があります。

hibernate.connection.url プロパティに絶対パスを指定してみてください。「C:\test」に移動し、アプリケーションの実行時にそのフォルダーをチェックインして、H2 がファイルを作成するかどうかを確認します。

于 2013-08-18T07:16:12.013 に答える