读书人

Spring札记8-hibernate集成

发布时间: 2012-08-31 12:55:03 作者: rapoo

Spring笔记8---hibernate集成

1.HibernateTemplate模板类

*装载单个实体的方法,在Spring内部,这些方法都会将具体操作委派给HibernateCallback接口的doInHibernate()回调反复,进而让Session与数据库进行交互。

?

Object get(...) throws DataAccessException;Object load(....) throws DataAccessException;Object loadAll(....) throws DataAccessException;Object refresh(....) throws DataAccessException;Object contains(....) throws DataAccessException;....
?

*存储单个实体的辅助方法

?

void lock(....) throws DataAccessException;Serializable save(....) throws DataAccessException;void update(....) throws DataAccessException;void saveOrUpdate(....) throws DataAccessException;void persist(....) throws DataAccessException;Object merge(....) throws DataAccessException;void delete(....) throws DataAccessException;void deleteAll(....) throws DataAccessException;void flush(....) throws DataAccessException;void clear(....) throws DataAccessException;
?

*此外还有基于HQL的查找方法和基于命名查询的查找方法

?

命名查询方法查找示例如下:

?

现在test/Query.hbm.xml定义了如下2个命名查询,其中一个还启用了命名参数

?

<query name="namedVisits"><![CDATA[   from Visits as vi where vi.id=?]]></query><query name="namedAndParamedVisits"><![CDATA[   from Visits as vi where vi.id=:id]]></query>
?

接下来再编码中引用

?

List list1 = this.getHibernateTemplate().findByNamedQuery("namedVisits",2);List list2 = this.getHibernateTemplate().findByNamedQueryAndNamedParam("namedAndParamedVisits",new Stringp[]{"id"},new Object[]{2});
?

2.关于SessionFactory.getCurrentSession()方法的使用

?

注意几个细节:

?

* Session对象是当前活动事务所征集的Session

?

*DataAccessException异常体系适合于Spring提供的各种DAO层集成技术,比如JDBC,Hibernate,JPA等

@Repository是应用类的注解,其直接应用到DAO对象本身,比如HibernateClinic。

?

3. LocalSessionFactoryBean

?

LocalSessionFactoryBean集结了Hibernate SessionFactory相关的所有元数据信息。

如下配置:

?

<bean id="sessionFactory" ref="dataSource"/><property name="mappingResources"><list><value>...../xxx.hbm.xml</value><value>...../xxx.hbm.xml</value></list></property><property name="hibernateProperties"><props><prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop><prop key="hibernate.show_sql">true</prop><prop key="hibernate.use_sql_comments">true</prop><prop key="hibernate.format_sql">true</prop></props></property></bean>
?

4. 事务管理的支持

?

需在Spring配置文件中做如下配置

?

<bean id="transactionManager" p:sessionFactory-ref="sessionFactory"/>
?

5. 基于hibernate的Lob处理

?

*对Blob字段的操作可详见Spring的imagedb范例。

?

*Oracle数据库中,较大内容varchar2(4000)往往也很无奈。对此,我们往往采用大对象进行存储(clob),但是由于jdbc驱动对CLOB支持不好,因此使用hibernate进行操作时,往往非常麻烦。但是使用最新的oracle驱动,ojdbc14.jar

然后稍微更改Spring中,SessionFactory的属性参数:

<bean id="sessionFactory"

?

?????????????????? />

?????????????????? </property>

?????????????????? <property name="hibernateProperties">

??????????????????????????? <props>

???????????????????????????????????? <prop key="hibernate.dialect">

?????????????????????????????????????????????? org.hibernate.dialect.Oracle9Dialect

???????????????????????????????????? </prop>

???????????????????????????????????? <prop key="hibernate.connection.SetBigStringTryClob">true</prop>

??????????????????????????? </props>

?????????????????? </property>

?????????????????? <property name="mappingResources">

</property>

</bean>

然后将映射文件中更改成:

?? <property name="newsContent" type="text">

??????????? <column name="NEWS_CONTENT" />

??????? </property>

在POJO类中,直接使用String类型,就可以自由访问了!

?

读书人网 >软件架构设计

热点推荐