`
leiwuluan
  • 浏览: 695156 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

在Spring应用中使用Hibernate

阅读更多
<1>Spring in Hibernate示例

<1 Spring配置文件

 

    <bean id="dataSource"

          class="org.springframework.jdbc.datasource.DriverManagerDataSource">

        <property name="driverClassName">

            <value>com.mysql.jdbc.Driver</value>

        </property>

        <property name="url">

            <value>jdbc:mysql://localhost:3306/test</value>

        </property>

        <property name="username">

            <value>root</value>

        </property>

        <property name="password">

            <value>root</value>

        </property> 

</bean>

 

    <bean id="sessionFactory" 

          class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"

          destroy-method="close">

        <property name="dataSource">

            <ref bean="dataSource"/>

        </property>

        <property name="mappingResources">

            <list>

                <value>com/pojo/User.hbm.xml</value>

            </list>

        </property>

        <property name="hibernateProperties">

            <props>

                <prop key="hibernate.dialect">

                    org.hibernate.dialect.MySQLDialect

                </prop>

            </props>

        </property>

</bean>

 

 

    <bean id="userDAO" class="com.dao.UserDAO">

        <property name="sessionFactory">

            <ref bean="sessionFactory"/>

        </property>

    </bean>

 

2> Hibernate映射文件

<hibernate-mapping>

    <class name="com.pojo.User" table="user">

        <id name="id" column="id">

            <generator class="native"/>

        </id>

        <property name="name" column="name"/>

        <property name="age" column="age"/>

    </class>

</hibernate-mapping>

 

3> User

public class User {

    private Integer id;

    private String name;

private Integer age;

//get set method…

}

 

 

4> IUserDAO接口

public interface IUserDAO {

    public void insert(User user);

    public User find(Integer id);

}

 

5> UserDAO实现类

public class UserDAO implements IUserDAO {

 

private SessionFactory sessionFactory;

 

public UserDAO() {}

 

    public UserDAO(SessionFactory sessionFactory) {

        this.setSessionFactory(sessionFactory);

}

 

    public void setSessionFactory(SessionFactory sessionFactory) {

        this.sessionFactory = sessionFactory;

}

 

    public void insert(User user) {

        Session session = sessionFactory.openSession();

        Transaction tx= session.beginTransaction();

        session.save(user);

        tx.commit();

        session.close();

    }

 

    public User find(Integer id) {

        Session session = sessionFactory.openSession();

        User user = (User) session.get(User.class, id);

        session.close();

        return user;

    }

}

 

6> Test测试类

public class Test{

    public static void main(String[] args) {

        ApplicationContext context = new FileSystemXmlApplicationContext(

                    "beans-config.xml");

        IUserDAO userDAO = (IUserDAO) context.getBean("userDAO");

       

        User user = new User();

        user.setName("caterpillar");

        user.setAge(new Integer(30));

       

        userDAO.insert(user);

       

        user = userDAO.find(new Integer(1));

       

        System.out.println("name: " + user.getName());

    }

}

 

 

<2>HibernateTemplate类与HibernateDaoSupport

借助HibernateTemplate我们可以脱离每次数据操作必须首先获得Session实例、启动事务、提交/回滚事务以及烦杂的try/catch/finally的繁琐操作。从而获得以上代码中精干集中的逻辑呈现效果。

HibernateSupport实现了HibernateTemplateSessionFactory实例的关联。

 

使用示例部分代码:

public class UserDaoHibernate extends HibernateDaoSupport implements IUserDAO {

  public List getUsers() {

         return getHibernateTemplate().find("from User");

  }

  

  public User getUser(Integer id) {

         return (User) getHibernateTemplate().get(User.class,id);

  }

  

  public void saveUser(User user) {

         getHibernateTemplate().saveOrUpdate(user);

  }

  

  public void removeUser(Integer id) {

         Object user=getHibernateTemplate().load(User.class,id);

         getHibernateTemplate().delete(user);

  }

}

 

 

12.事务管理

对于J2EE 应用程序而言,事务的处理一般有两种模式:

 

1 依赖特定事务资源的事务处理

这是应用开发中最常见的模式,即通过特定资源提供的事务机制进行事务管理。如通过JDBCJTA rollbackcommit方法;Hibernate Transaction rollbackcommit方法等。这种方法大家已经相当熟悉。

 

2 依赖容器的参数化事务管理

通过容器提供的集约式参数化事务机制,实现事务的外部管理。

 

Spring提供了一致的事务管理抽象。这个抽象是Spring最重要的抽象之一, 它有如下的优点:

 

(1)为不同的事务API提供一致的编程模型,如JTAJDBCHibernateiBATIS数据库层 JDO

(2)提供比大多数事务API更简单的,易于使用的编程式事务管理API

(3)整合Spring数据访问抽象

(4)支持Spring声明式事务管理

 

Spring事务管理能给我们带来什么?

对于传统的基于特定事务资源的事务处理而言(如基于JDBC 的数据库访问),Spring并不会对其产生什么影响,我们照样可以成功编写并运行这样的代码。同时,Spring还提供了一些辅助类可供我们选择使用,这些辅助类简化了传统的数据库操作流程,在一定程度上节省了工作量,提高了编码效率。

 

对于依赖容器的参数化事务管理而言,Spring 则表现出了极大的价值。Spring本身也是一个容器,只是相对EJB容器而言,Spring显得更为轻便小巧。我们无需付出其他方面的代价,即可通过Spring实现基于容器的事务管理(本质上来讲,Spring的事务管理是基于动态AOP)。

(1)编程式事务管理

使用TransactionTemplate

TransactionTemplate采用和其他Spring模板 ,如 HibernateTemplate一样的方法。它使用回调方法,把应用 程序代码从处理取得和释放资源中解脱出来(不再有try/catch/finally)。如同 其他模板,TransactionTemplate是线程安全的。

 

示例:

 

UserDAO实现类

public class UserDAO implements IUserDAO {

    private TransactionTemplate transactionTemplate;

    private HibernateTemplate hibernateTemplate;

 

    public void setSessionFactory(

            SessionFactory sessionFactory) {

        this.transactionTemplate =

            new TransactionTemplate(

                    new HibernateTransactionManager(

                            sessionFactory)); 

        this.hibernateTemplate =

            new HibernateTemplate(sessionFactory);

    }

   

    public void insert(User user) {

        final User userData = user;

       

        transactionTemplate.setPropagationBehavior(

                TransactionDefinition.PROPAGATION_REQUIRED);

       

        transactionTemplate.execute(

          new TransactionCallbackWithoutResult() {

                protected void doInTransactionWithoutResult(

                        TransactionStatus status) {

                    try {

                        hibernateTemplate.save(userData);

                    }

                    catch(DataAccessException e) {

                        e.printStackTrace();

                        status.setRollbackOnly();

                    }

                }

            });

    }

 

    public User find(Integer id) {

        User user =

            (User) hibernateTemplate.get(User.class, id);

       

        return user;

    }

}

 

Test测试类

public class Test{

    public static void main(String[] args) {

        ApplicationContext context = new FileSystemXmlApplicationContext(

                    "beans-config.xml");

       

        IUserDAO userDAO =

            (IUserDAO) context.getBean("userDAO");

       

        User user = new User();

        user.setName("caterpillar");

        user.setAge(new Integer(30));

       

        userDAO.insert(user);

       

        user = userDAO.find(new Integer(1));

       

        System.out.println("name: " + user.getName());

    }

}

 

(2)声明式事务管理

Spring也提供了声明式事务管理。这是通过Spring AOP实现的。

 

大多数Spring用户选择声明式事务管理。这是最少影响应用代码的选择, 因而这是和非侵入性的轻量级容器的观念是一致的。

 

示例:

 

Spring配置文件

    <bean id="dataSource"

          class="org.springframework.jdbc.datasource.DriverManagerDataSource">

        <property name="driverClassName">

            <value>com.mysql.jdbc.Driver</value>

        </property>

        <property name="url">

            <value>jdbc:mysql://localhost:3306/test</value>

        </property>

        <property name="username">

            <value>root</value>

        </property>

        <property name="password">

            <value>root</value>

        </property> 

    </bean>

   

    <bean id="sessionFactory" 

          class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"

          destroy-method="close">

        <property name="dataSource">

            <ref bean="dataSource"/>

        </property>

        <property name="mappingResources">

            <list>

                <value>com/pojo/User.hbm.xml</value>

            </list>

        </property>

        <property name="hibernateProperties">

            <props>

                <prop key="hibernate.dialect">

                    org.hibernate.dialect.MySQLDialect

                </prop>

            </props>

        </property>

    </bean>

 

    <bean id="userDAO" class="com.dao.UserDAO">

        <property name="sessionFactory">

            <ref bean="sessionFactory"/>

        </property>

    </bean>

 

    <bean id="transactionManager"

          class="org.springframework.orm.hibernate3.HibernateTransactionManager">

        <property name="sessionFactory">

            <ref bean="sessionFactory"/>

        </property>

    </bean>

       

    <bean id="userDAOProxy"

          class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">

        <property name="transactionManager">

            <ref bean="transactionManager"/>

        </property>

<span st

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics