Hibernate всегда удаляет все данные из таблицы самостоятельно - PullRequest
3 голосов
/ 14 сентября 2010

Привет, я разрабатываю приложение Spring mvc, которое использует hibernate для подключения к базе данных mysql, в которой хранятся файлы.

У меня есть два метода. один, который добавляет все файлы из определенного пути к файлу по моему выбору, и другой метод, который вызывает запрос, чтобы вернуть мне список файлов, сохраненных из mysql.

Проблема заключается в следующем. Когда я выполняю первый метод самостоятельно, т.е. заполняю базу данных, он работает нормально, я вижу содержимое этой таблицы из командной строки mysql. однако, когда я затем выполняю метод запроса сразу после его заполнения, содержимое этой таблицы полностью исчезает мгновенно. Как будто hibernate только временно сохранил данные в mysql или где-то в mysql, он немедленно удалил данные и не сохранил их.

это метод заполнения таблицы:

/**
     * Test Method: ideal for another class to do this kind of work and this
     * pass the FileObject into this class
     */
    public void addSomeFiles() {
        System.out.println("addSomeFiles");
        File dir = new File(picturesPath);
        String[] fileNames = dir.list();

        for (int i = 0; i < fileNames.length; i++) {

            System.out.println(fileNames[i]);
            File file = new File(picturesPath + "\\" + fileNames[i]);
            if (file.isFile()) {
                FileObject fileO = contstructFileObject(file);
                if (fileO == null) {
                    System.out.println("fileO is null!!!!!");
                } else {
                    // addFile(fileO);

                    dbFileHelper.addFile(fileO);
                }
            }

        }

        System.out.println("//////////////");
        // File file;

    }

......... Класс шаблона Hibernate ........

public class DbFileHelper implements DbFileWrapper {


    private HibernateTemplate hbTemplate;
    //private static final String SQL_GET_FILE_LIST = "select filename, size, id, type from fileobject";
    private static final String SQL_GET_FILE_LIST = "select new FileObject(filename, size, id, type) from FileObject";

    public DbFileHelper() {

    }

    public void setHbTemplate(HibernateTemplate hbTemplate) {
        System.out.println("setHbTemplate");
        System.out.println("///////////////////");
        System.out.println("///////////////////");
        System.out.println("///////////////////");

        this.hbTemplate = hbTemplate;
    }





    // ////////////////////////////////////////////////

    @Override
    public String addFile(FileObject file) {
        // TODO Auto-generated method stub
        System.out.println("addFile using hibernate");

        if (hbTemplate == null) {
            System.out.println("hbTemplate is null!! why?");
        }
        hbTemplate.saveOrUpdate(file);
        hbTemplate.flush();

        return "added succesfuly";
    }

А вот другой метод, который делает запрос:

........................

публичный JSONArray getFileList (тип String) {

    return constructJsonArray(dbFileHelper.getFileList(ALL));
}

private JSONArray constructJsonArray(List<FileObject> fileList ){

    JSONArray mJsonArray = new JSONArray();

    for (int i = 0; i < fileList.size(); i++) {
        System.out.println("fileName = " + fileList.get(i).getFilename() );
        //mJson.put("Filename", fileList.get(i).getFileName() );

        mJsonArray.add( new JSONObject().put("File ID", fileList.get(i).getId() ));
        mJsonArray.add( new JSONObject().put("Filename", fileList.get(i).getFilename() ));
        mJsonArray.add( new JSONObject().put("File type", fileList.get(i).getType()));
        mJsonArray.add( new JSONObject().put("File Size", fileList.get(i).getSize()));
    }

    return mJsonArray;
}

.......... hibernate Шаблон класса .......

private static final String SQL_GET_FILE_LIST = "select new FileObject(filename, size, id, type) from FileObject";

@Override
public List<FileObject> getFileList(String type) {
    // TODO Auto-generated method stub
    List<FileObject> files = hbTemplate.find(SQL_GET_FILE_LIST);
    //hbTemplate.flush();
    return files;
}

..........

Наконец, вот экран печати того, что я изначально положил в свой стол, но исчезает сам по себе:

http://img411.imageshack.us/img411/9553/filelisti.jpg

Я что-то здесь упускаю?

редактировать: дополнительная информация.

my hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.kc.models.FileObject" >

    <class name="com.kc.models.FileObject" table="fileobject">
        <id name="id" column="ID">
            <generator class="native" />
        </id>
        <property name="filename" type="string" column="FILENAME" />
        <property name="type" type="string" column="TYPE" />
        <property name="size" type="double" column="SIZE" />
        <property name="file" type="blob" length="1000000000" column="FILE" />
    </class> 

</hibernate-mapping> 

мой контроллер:

@Override
public ModelAndView handleRequest(HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    // TODO call a method that returns a list of Mobile Apps.


    testAddingSomeFilesToDb();
    return new ModelAndView("" + "testJsonResponse", "jsonArray",
            getFileList() );

}


private void testAddingSomeFilesToDb() {
    ctx = new ClassPathXmlApplicationContext("zang-file-service.xml");
    FileHelper file = (FileHelper) ctx.getBean("fileHelper");
    file.addSomeFiles();
}

/**
 * Get file list from sql server based on type
 * @return file list in json
 */ 
private JSONArray getFileList() {
    // TODO: Get request parameter that states what type of file extensions
    // the client wants to recieve

    ctx = new ClassPathXmlApplicationContext("zang-file-service.xml");
    FileHelper file = (FileHelper) ctx.getBean("fileHelper");

    return file.getFileList("all");
}

Другое редактирование:

мой файл .xml с настройкой фабрики сеанса и шаблона гибернации

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

    <!-- http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd -->

    <!-- Config properties files -->



    <!-- Hibernate database stuff -->



    <!-- <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
        <property name="locations"> <list> <value>/properties/jdbc.properties</value> 
        </list> </property> </bean> -->


    <!-- <bean id="dataSource1" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
        <property name="driverClassName" value="${database.driver}" /> <property 
        name="url" value="${database.url}" /> <property name="username" value="${database.user}" 
        /> <property name="password" value="${database.password}" /> </bean> -->


    <bean id="dataSource1"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/zangshop" />
        <property name="username" value="root" />
        <property name="password" value="password" />

    </bean>


    <!-- LocalSessionFactoryBean u need to put the hbm files in the WEB-INF/classes 
        root director -->

    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource1"></property>
        <property name="mappingResources">
            <list>
                <value>FileObject.hbm.xml</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">create</prop>
            </props>
        </property>
    </bean>


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

    <bean id="dbFileHelper" class="com.kc.models.DbFileHelper">
        <property name="hbTemplate" ref="hbTemplate"></property>
    </bean>

    <bean id="fileHelper" class="com.kc.models.FileHelper">
        <property name="dbFileHelper" ref="dbFileHelper"></property>
    </bean>

</beans>

Ответы [ 2 ]

8 голосов
/ 14 сентября 2010

я исправил проблему

я изменил <prop key="hibernate.hbm2ddl.auto">create</prop>

до <prop key="hibernate.hbm2ddl.auto">update</prop> и все заработало

0 голосов
/ 14 сентября 2010

Вы создаете / уничтожаете SessionFactory между вызовами? Может быть, для свойства hbm2ddl.auto установлено значение create-drop?

На самом деле, вы можете показать настройки Hibernate?

Ссылки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...