2011-04-27 44 views
2

我想在Spring中使用hibernate並使用HSQL DB。我無法將我的對象持久化到數據庫,因爲Hibernate不從對象獲取值,而是在生成的插入語句中使用空值。我現在試圖調試這個問題一段時間,並且已經用完了想法。任何有關這個問題的幫助,我們都非常感謝Hibernate在與Spring一起使用時將空值插入到表中

這是我的代碼片段。

應用程序上下文(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類將持久對象到數據庫表。

@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,「Manual」,「Hibernate Test Example」)。

您能否讓我知道我在做什麼以上錯誤。上述任何幫助真的很感激。

問候,

虛無

回答

1

我相信這是因爲你有一個本地發電機組爲你的id字段,所以冬眠決定離開的選擇。它的數據庫。嘗試手動運行查詢並查看將設置的ID。如果它是正確的,請在休眠時提交一個錯誤(升級到最新版本後)。

+0

謝謝你的回覆Bozho。我已經想出了這個問題。看來由HSQL創建的表沒有聲明主鍵。該列被創建爲唯一但不是主鍵。昨天我病了,無法更新這個帖子。我會將其更新爲已關閉。 – user727833 2011-04-29 14:11:34

相關問題