2013-02-19 16 views
4

Я новый для встроенных баз данных, но я получил его работает как минимум. Меня смущает то, что мои данные не сохраняются между прогонами. Я имею в виду, что это было бы неплохо для тестирования? Я не хочу добавить данные в свою базу данных каждый раз, когда я запустить приложениеSpring + Hibernate + H2 Embedded DB. Как сохраняются данные?

Так что я искал способ сделать это, и я обнаружил, что я должен настроить подключение спящий режим URL, который я пытался как этот

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

в моем HibernateConfiguration.java. Без успеха, однако, никаких ошибок, но и ничего не было сохранено, и я не нашел этот тестовый файл, который должен быть создан с этого URL-адреса. (Запуск окна и проверил свою пользовательскую папку)

Я также видел, что его можно сделать как этот

<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. если это необходимо, я опубликую все свои конфиги.

Редактировать: Обновлен мой вопрос, чтобы сфокусироваться на одном вопросе и включить мои конфиги.

HibernateConfiguration.java package 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> 

Там, конечно, тоже пом, где я получил все зависимости, но я не думаю, что это необходимо.

Я создаю объект (Course.java) и сохраняю его в db, это нормально, и я могу загрузить его снова. Но когда я меняю свой код и приложение перезагружается, объект больше не существует.

Редактировать2: Я добавляю данные следующим образом.

Связывание заводской сессии.

@Autowired 
private SessionFactory sessionFactory; 

Добавить свой объект курса в базу данных следующим образом.

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(); 

Это прекрасно работает, и я могу получить этот курс. Однако, когда я запускаю приложение в следующий раз, нет курса с идентификатором IDA511, и я получаю исключение нулевого указателя. Означает ли это, что курс может быть сохранен только на сессии? гул

+0

Вы установили настройки Hibernate hbm2ddl для создания капли? Если это так, ваши данные будут удалены после закрытия соединения. Взгляните на http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/session-configuration.html Таблица 3.7 ... Также о загрузочном SQL, поместите файл с именем ** import. sql ** на вашем корневом пути и hibernate запускает его. См. Это сообщение: http://stackoverflow.com/questions/673802/how-to-import-initial-data-to-database-with-hibernate – gerrytan

+0

Это похоже на несколько вопросов о разных вещах. Было бы лучше сузить его до одной проблемы, дать более подробную информацию об этом и открыть другие вопросы для других. –

+0

Не могли бы вы разместить все файлы конфигурации (по крайней мере, Hibernate)? –

ответ

0

Поскольку вы используете приложение в Windows, возможно, домашний каталог не найден с помощью оператора тильды '~'.

Попробуйте дать свой hibernate.connection.свойство url - абсолютный путь, например. «C: \ test» и проверьте эту папку при запуске приложения, чтобы узнать, создает ли H2 файл для вас.