Hibernate вставляет нулевые значения в таблицу при использовании с Spring

#java #spring #hibernate

#java #spring #переход в спящий режим

Вопрос:

Я пытаюсь использовать hibernate в Spring и использую HSQL DB. Я не могу сохранить свои объекты в базе данных, поскольку Hibernate не принимает значения из object и вместо этого использует нулевые значения в сгенерированных операторах Insert. Я уже некоторое время пытаюсь отладить проблему, и у меня закончились идеи. Мы высоко ценим любую помощь по этому вопросу.

Вот мои фрагменты кода.

Контекст приложения (applicationContext.xml ): Я настраиваю свой источник данных, фабрику сеансов, DAO и диспетчер транзакций в контексте.

 <context:component-scan base-package="com.wb.services.fileservice" />

    <tx:annotation-driven />

<jdbc:embedded-database id="dataSource">
    <jdbc:script location="classpath:com/wb/services/testdb/schema.sql" />
    <jdbc:script location="classpath:com/wb/services/testdb/test-data.sql" />
</jdbc:embedded-database>

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="mappingResources">
        <list>
            <value>/com/wb/services/fileservice/file.hbm.xml</value>
        </list>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
            <prop key="hibernate.cache.provider_class">org.hibernate.cache.NoCacheProvider</prop>
            <prop key="hibernate.show_sql">true</prop>
        </props>
    </property>
</bean>

<bean id="fileServiceDAO" class="com.wb.services.fileservice.FileServiceDAO">
    <constructor-arg ref="sessionFactory" />
</bean>

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

Мой файл отображения Hibernate (file.hbm.xml ):

 <class name="com.wb.services.fileservicemodel.FilePrintHibernate" table="T_FILES">

<id name="fileID" column="File_ID" type="int">
        <generator class="native"/>
    </id>
    <property name="name" column="Name"/>
    <property name="text" column="Text"/>
</class>
  

Переходный класс, который необходимо сохранить (FilePrintHibernate):

 public class FilePrintHibernate implements Serializable {

    private int fileID;
    private String name;
    private String text;

// Skipping getters and setters for the above.

}
  

Класс DAO, который будет сохранять объекты в таблице DB.

 @Repository

@Transactional

public class FileServiceDAO {

    private SessionFactory sessionFactory;


    public FileServiceDAO() {
    }

    public FileServiceDAO(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    public SessionFactory getSessionFactory() {
        return sessionFactory;
    }

    public Session getCurrentSession() {
        return sessionFactory.getCurrentSession();
    }

    @Transactional(readOnly = false, propagation=Propagation.REQUIRED)
    public void findByCreditCard(String filename) {

        FilePrintHibernate filePrintHibernate = new FilePrintHibernate();
        filePrintHibernate.setFileID(2);
        filePrintHibernate.setName("Manual");
        filePrintHibernate.setText("Hibernate Test Example");

        getCurrentSession().save(filePrintHibernate);
        getCurrentSession().flush();
    }
}
  

Когда приложение запускается и класс DAO (файл кода 4 выше) пытается сохранить объект FilePrintHibernate, я получаю инструкцию insert: insert into T_FILES (File_ID, Name, Text) values (null, ?, ?) . Пожалуйста, обратите внимание на значения, которые он пытается вставить. вместо значений, которые я установил (2, «Руководство», «Тестовый пример гибернации»).

Не могли бы вы, пожалуйста, сообщить мне, что я делаю неправильно выше. Любая помощь из вышеперечисленного действительно ценится.

С уважением,

Nihil

Ответ №1:

Я полагаю, это потому, что у вас есть собственный набор генераторов для вашего поля id, и поэтому hibernate решает оставить выбор за ним базе данных. Попробуйте выполнить запрос вручную и посмотрите, какой идентификатор будет установлен. Если оно правильное, запишите ошибку в hibernate (после обновления до последней версии).

Комментарии:

1. Спасибо тебе за ответ, Божо. Я разобрался с проблемой. Похоже, что в таблице, созданной HSQL, не был объявлен первичный ключ. Столбец был создан как уникальный, но не как первичный ключ. Вчера я был на больничном и не смог обновить сообщение. Я обновлю ее как закрытую.