Spring in Action 笔记(III)
By: icess blog: http://blog.matrix.org.cn/page/icess
这次来看看使用Spring的Hibernate模板来操作数据, Spring提供了Hibernate的一层包装,使Hibernate使用起来更加方便,尤其是结合Hibernate Annotation时, 配置文件更少,维护更加简单. 下面来看看吧.
下面是一个测试数据实体类TestData.java 和前一篇提到的实体类一样,只不过用了Annotation注释.
package test.orm.hibernate.model;
import javax.persistence.Basic;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "test" ,schema = "APP" )
public class TestData {
private int id;
private String name;
public TestData( int id, String name) {
this .id = id;
this .name = name;
}
public TestData() {}
@Id
public int getId() {
return id;
}
public void setId( int id) {
this .id = id;
}
@Basic
public String getName() {
return name;
}
public void setName(String name) {
this .name = name;
}
}
下面是测试Hibernate模板的类, TestHibernateTemplate.java
package test.orm.hibernate;
import java.sql.SQLException;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.HibernateTemplate;
import test.orm.hibernate.model.TestData;
public class TestHibernateTemplate {
private HibernateTemplate hibernateTemplate;
public TestHibernateTemplate() {}
public HibernateTemplate getHibernateTemplate() {
return hibernateTemplate;
}
public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
this .hibernateTemplate = hibernateTemplate;
}
//测试使用HibernateTemplate来操作数据
public TestData getTestData( final int id) {
return (TestData) hibernateTemplate.execute( new HibernateCallback() {
public Object doInHibernate(Session s) throws HibernateException, SQLException {
// TODO Auto-generated method stub
return s.get(TestData.class, id);
}
});
}
// 上面查询数据的方法 使用了HibernateCallBack接口,对于这样简单的查询,可以使用下面由HibernateTemplate 提供的更简单的方法
public TestData getTestData2( final int id) {
return (TestData) hibernateTemplate.get(TestData.class, id);
}
/* 如果上面的两处方法使用Load 方法的时, 抛出延迟加载属性异常, Spring管理Session的问题, 应该是Spring用完Session 然后就关闭了,
* 所以不可以延迟加载, 也就不可以使用load 方法了,,????? 为什么????*/
// 其他操作数据方法 如: 插入,修改.... 和使用Hibernate session 差不多, HibernateTemplate只是Session的包装
}
可以看到使用Hibernate模板来操作数据,是多么简单,
注意: 上面注释中,提到了在使用Load方法时候,会有问题, Session in view 时候使用load是不会出问题的, 这里Spring提供的方法应该是按照Hibernate的语义写的吧.
下面就是用来测试上面的类是否正常工作的测试类了.TestApp.java
package test.orm.hibernate;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import test.jdbc.DatabaseUtils;
import test.orm.hibernate.model.TestData;
public class TestApp {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
DatabaseUtils dataUtils = new DatabaseUtils();
dataUtils.connect();
System.out.println( "Open database:!" );
ApplicationContext context = new ClassPathXmlApplicationContext( "test/orm/hibernate/spring-hibernate.xml" );
TestHibernateTemplate hibernateTemplate = (TestHibernateTemplate) context.getBean( "testDao" );
System.out.println( "name : " );
TestData data = hibernateTemplate.getTestData( 9 );
System.out.println( "name : " + data.getName());
data = hibernateTemplate.getTestData2( 3 );
System.out.println( "name 2: " + data.getName());
dataUtils.disconnect();
}
}
注意: 本测试中用到了上一篇使用到的DatabaseUtils.java 工具类来操作Derby数据库.
由
以上实例可以看出,在Spring中使用Hibernate,效率更高一些. 你不这样认为吗?
同时
Spring也提供了 JDO等其他一些数据操作框架的包装,使用上基本上 是一样的这里就不在详述了.
下一次我们来看看Spring的I18N处理,和自定义属性编辑器的实现.