`
xiaofengtoo
  • 浏览: 492826 次
  • 性别: Icon_minigender_1
  • 来自: xiamen
社区版块
存档分类
最新评论

spring2.5 + hibernate3.2 标注(annotation)开发的简单示例

阅读更多
转载于:IamHades的专栏http://blog.csdn.net/IamHades/archive/2008/01/11/2038188.aspx
看过此文,我并不是很赞同实际项目中用此方案,但依然可以借鉴。

以下是作者的处理:
首先来定义一个hibernate(jpa?)的基于annotation方式的pojo:

/**//*
 * Account.java
 *
 * Created on 2007-12-29, ÏÂÎç05:51:47
 */
package spring.withouttemplate.model;

import java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

/** *//**
 * @author icechen
 * 
 */
@Entity
public class Account implements Serializable ...{
    private Long id;
    private String name;

    @Id
    @GeneratedValue
    public Long getId() ...{
        return id;
    }

    public void setId(Long id) ...{
        this.id = id;
    }

    public String getName() ...{
        return name;
    }

    public void setName(String name) ...{
        this.name = name;
    }
}



然后定义一个操作数据库的interface:

/*
 * AccountRepository.java
 *
 * Created on 2007-12-29, 下午05:52:56
 */
package spring.withouttemplate.dao;

import spring.withouttemplate.model.Account;

/** *//**
 * @author icechen
 *
 */
public interface AccountRepository ...{
    public Account loadAccount(String username);
    public Account save(Account account);
}



接下来是该接口的spring实现,也是基于annotation方式,而且不再使用hibernatetamplate,也就不需要继承spring的特定类,真正做到零侵入:


/*
 * HibernateAccountRepository.java
 *
 * Created on 2007-12-29, 下午05:53:34
 */
package spring.withouttemplate.dao;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import spring.withouttemplate.model.Account;

/** *//**
 * 设计一个非侵入式的spring bean,不再继承spring的api来实现,而直接操作hibernate的session
 * 
 * @author icechen
 * 
 */
// 这个声明相当重要,spring必须对操作数据库的bean声明事务,否则就无法绑定hibernate的session
// 通常情况下,声明为“只读”模式会对sql进行优化,所以这里默认声明为true
// 但是“写”操作必须覆盖声明为“false”
@Service("demo")
@Transactional(readOnly = true)
@Repository
public class HibernateAccountRepository implements AccountRepository ...{

    private SessionFactory factory;

//    public HibernateAccountRepository(SessionFactory factory) {
//        this.factory = factory;
//    }

    // 此声明对不写数据库的操作,根据spring的默认机制来决定是true或者false,否则跟全局声明保持一致
    @Transactional(propagation = Propagation.SUPPORTS)
    public Account loadAccount(String username) ...{
        return (Account) factory.getCurrentSession().createQuery("from Account acc where acc.name = :name").setParameter("name", username)
                .uniqueResult();
    }

    // 数据库的写操作,必须声明为false,否则无法将数据写如数据库
    @Transactional(readOnly = false)
    public Account save(Account account) ...{
        factory.getCurrentSession().saveOrUpdate(account);
        return account;
    }

    @Autowired(required = true)
    public void setFactory(SessionFactory factory) ...{
        this.factory = factory;
    }

}



最后写个类来测试这段程序是否正常工作:
*
 * SpringDemo.java
 *
 * Created on 2007-12-29, 下午06:10:10
 */
package spring.withouttemplate.dao;

import java.util.ArrayList;
import java.util.Collection;

import org.springframework.context.support.FileSystemXmlApplicationContext;

import spring.withouttemplate.model.Account;

/** *//**
 * @author icechen
 *
 */
public class SpringDemo ...{

    /** *//**
     * @param args
     */
    public static void main(String[] args) ...{
        Collection<String> files = new ArrayList<String> ();
        files.add("etc/beans.xml");
        files.add("etc/dataAccessContext-local.xml");

        FileSystemXmlApplicationContext ctx = new FileSystemXmlApplicationContext(files.toArray(new String[0]));
        AccountRepository demo = (AccountRepository) ctx.getBean("demo");
        Account account = demo.loadAccount("icechen");
        System.out.println(account.getId());
        Account newAccount = new Account();
        newAccount.setName("jay");
        newAccount = demo.save(newAccount);
        System.out.println(newAccount.getId());
    }

}



别忙,还有重要的事没有做,我们还需要少许配置(虽然使用了annotation方式,但是不等于不需要配置):

最后一段测试程序中两个xml:

beans.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd">
    <context:annotation-config />
    <context:component-scan base-package="*" />
    <!-- 
        <bean id="accountRepo"
        class="spring.withouttemplate.dao.HibernateAccountRepository">
        <constructor-arg ref="sessionFactory" />
        </bean>
    -->
</beans>


dataAccessContext-local.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

    <!-- ========================= GENERAL DEFINITIONS ========================= -->
    <!-- Configurer that replaces ${...} placeholders with values from properties files -->
    <!-- (in this case, mail and JDBC related properties) -->

    <bean id="propertyConfigurer"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>etc/jdbc.properties</value>
            </list>
        </property>
    </bean>

    <bean id="dataSource"
        class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName">
            <value>${jdbc.driverClassName}</value>
        </property>
        <property name="url">
            <value>${jdbc.url}</value>
        </property>
        <property name="username">
            <value>${jdbc.username}</value>
        </property>
        <property name="password">
            <value>${jdbc.password}</value>
        </property>
    </bean>

    <!-- Hibernate SessionFactory -->
    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource">
            <ref local="dataSource" />
        </property>

        <property name="configurationClass"
            value="org.hibernate.cfg.AnnotationConfiguration" />

        <property name="configLocation">
            <value>classpath:hibernate.cfg.xml</value>
        </property>
    </bean>



    <bean id="transactionManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>

    <bean
        class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" />

    <bean
        class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor">
        <property name="transactionInterceptor">
            <ref bean="transactionInterceptor" />
        </property>
    </bean>

    <bean id="transactionInterceptor"
        class="org.springframework.transaction.interceptor.TransactionInterceptor">
        <property name="transactionManager">
            <ref bean="transactionManager" />
        </property>
        <property name="transactionAttributeSource">
            <bean
                class="org.springframework.transaction.annotation.AnnotationTransactionAttributeSource" />
        </property>
    </bean>
</beans>

最后当然还需要hibernate.cfg.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!-- show sql -->
        <property name="show_sql">true</property>
        <property name="format_sql">true</property>
        <!-- mapping class -->
        <mapping class="spring.withouttemplate.model.Account" />

    </session-factory>
</hibernate-configuration>

文中代码:http://download.csdn.net/source/335193
分享到:
评论

相关推荐

    struts2.1 + spring 2.5 + hibernate 3.2 增删改查

    Struts2.1、Spring 2.5 和 Hibernate 3.2 是经典的Java Web开发框架组合,用于构建高效、可维护的企业级应用。这个详细例子将深入探讨如何使用这三个框架协同工作,实现数据库的增(Add)、删(Delete)、改(Modify...

    spring2.5+hibernate3.2

    spring2.5 + hibernate3.2x 标注(annotation)开发的简单示例 http://blog.csdn.net/IamHades/archive/2008/01/11/2038188.aspx

    spring2.5+hibernate3.2+struts2.0组合配置说明

    在当前的软件开发领域,Spring2.5、Hibernate3.2 和 Struts2.0 这三个框架因其卓越的性能与丰富的功能而备受青睐。它们分别在业务逻辑层管理、数据持久化以及MVC模式实现方面提供了强大的支持。下面将详细介绍如何...

    Struts2+Spring2.5+Hibernate3+annotation 整合程序

    总之,"Struts2+Spring2.5+Hibernate3+annotation"的整合是Java Web开发中的经典组合,利用注解可以显著提升开发体验,减少配置文件的复杂性,使得项目结构更加清晰。如果你希望深入了解Java Web开发或者优化现有...

    struts2+spring2.5+hibernate3.2 annotation配置完整eclipse项目,带数据库脚本

    Struts2、Spring2.5和Hibernate3.2是经典的Java Web开发框架组合,它们各自在应用程序的不同层面提供了强大的功能。这个"sshTest"项目是一个使用这三个框架的注解配置的完整Eclipse工程,同时也包含了数据库脚本,...

    Struts2+Spring2.5+Hibernate3+Freemarker整合

    整合S2SH+Freemarker,后台用Spring管理各个bean,Hibernate做数据库持久化,viewer用Freemarker。整合中对Struts2,Hibernate,Spring都采用Annotation进行注解类。

    Struts2+Spring2.5+Hibernate3全注解实例详解

    超级详细的SSH2项目实例详解,并且附带两个项目详解。两种注解实现方式。...在JavaEE企业级开发中,以SSH2框架为核心的应用非常广,大象根据项目实践经验,通过二个实例,详细的为大家讲解如何实现全注解式的开发。

    基于Struts2.18+Spring2.5+Hibernater3.3+Annotation注解开发的电子商务网站demo

    这个“基于Struts2.18+Spring2.5+Hibernate3.3+Annotation注解开发的电子商务网站demo”是一个很好的学习资源,可以帮助开发者加深对这些框架的理解并熟悉实际应用。 1. **Struts2.18**:Struts2是MVC(模型-视图-...

    struts1.3+spring2.5+hibernate3.3 组合开发 annotation实现

    Struts1.3、Spring2.5 和 Hibernate3.3 是经典的 Java Web 开发框架组合,它们在企业级应用中广泛使用。这个组合被称为“SSH”(Struts-Spring-Hibernate),它允许开发者构建可扩展且松耦合的后端系统。在本项目中...

    Struts2+Spring2.5+Hibernate3+Freemarker框架整合

    整合S2SH+Freemarker+oscache,后台用Spring管理各个bean,Hibernate做数据库持久化,viewer用Freemarker。整合中对Struts2,Hibernate,Spring都采用Annotation进行注解类。

    java8+tomcat8+struts2.5+spring4.3+hibernate5.2框架搭建详细过程

    在搭建一个基于Java8 + Tomcat8 + Struts2.5 + Spring4.3 + Hibernate5.2 的项目前,首先需要对开发环境进行配置。 **1. Java8**: 作为项目的运行基础环境,确保已安装Java8,并正确设置JAVA_HOME等环境变量。 **2....

    JSF+Spring+Hibernate(Annotation)

    JSF+Spring+Hibernate(Annotation)的login小实例,建议入门的朋友看看,老鸟就免了,呵呵。环境:SQLSever2000+jdk5.0+spring2.0+hibernate3.2+jsf

    Struts2+Spring2+Hibernate3+Annotation所需JAR包

    ### Struts2+Spring2+Hibernate3+Annotation所需JAR包详解 在Java Web开发领域,Struts2、Spring2和Hibernate3是三个非常重要的框架,它们分别负责Web层、业务逻辑层和服务持久化层的功能实现。为了更好地整合这三...

    spring+hibernate3.2+struts2.0 注解

    在Spring 2.5版本之后,Spring引入了对注解的强大支持,允许开发者在类或方法上直接标注,替代XML配置来声明bean及其依赖。例如,`@Component`、`@Service`、`@Repository`和`@Controller`注解用于标记组件,`@...

    Spring4.1.4+SpringMVC4.1.4+Hibernate4.3.8基于annotation环境搭建

    我自己搭建的spring4+springMVC4+hibernate4.3.8基于annotation的开发环境 中间遇到好多问题,比如jar包不齐什么的,我把所有的包放在lib目录下,大家不用再去下载了

Global site tag (gtag.js) - Google Analytics