我想在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」)。
您能否讓我知道我在做什麼以上錯誤。上述任何幫助真的很感激。
問候,
虛無
謝謝你的回覆Bozho。我已經想出了這個問題。看來由HSQL創建的表沒有聲明主鍵。該列被創建爲唯一但不是主鍵。昨天我病了,無法更新這個帖子。我會將其更新爲已關閉。 – user727833 2011-04-29 14:11:34