Spring4和Hibernate4整合小结

来源:互联网 发布:武术 知乎 编辑:程序博客网 时间:2024/04/27 13:36

—以前学习的都是hibernate3,而hibernate5早都已经出现了,技术在不断的更新,不求最新版本,但是自己的技术也需要不断更新。
—网上大部分的配置都是hibernate3的,而且非常杂,都需要自己不断的尝试,记录一下自己尝试的过程。如果大家见到了我的文章,有什么不对的还请多多指教。

1、jar包的引入

<properties>        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>        <hibernate.version>4.1.6.Final</hibernate.version>        <spring.version>4.1.9.RELEASE</spring.version>        <struts.version>2.5.10.1</struts.version>        <slf4j.version>1.7.25</slf4j.version>        <log4j.version>2.8.1</log4j.version></properties><dependency>    <groupId>mysql</groupId>    <artifactId>mysql-connector-java</artifactId>    <version>5.1.43</version></dependency><dependency>    <groupId>com.alibaba</groupId>    <artifactId>druid</artifactId>    <version>1.0.9</version></dependency><dependency>    <groupId>org.hibernate</groupId>    <artifactId>hibernate-core</artifactId>    <version>${hibernate.version}</version></dependency><!-- spring -->    <dependency>        <groupId>org.springframework</groupId>        <artifactId>spring-core</artifactId>        <version>${spring.version}</version>    </dependency>    <dependency>        <groupId>org.springframework</groupId>        <artifactId>spring-expression</artifactId>        <version>${spring.version}</version>    </dependency>    <dependency>        <groupId>org.springframework</groupId>        <artifactId>spring-beans</artifactId>        <version>${spring.version}</version>    </dependency>    <dependency>        <groupId>org.springframework</groupId>        <artifactId>spring-aop</artifactId>        <version>${spring.version}</version>    </dependency>    <dependency>        <groupId>org.springframework</groupId>        <artifactId>spring-context</artifactId>        <version>${spring.version}</version>    </dependency>    <dependency>        <groupId>org.springframework</groupId>        <artifactId>spring-context-support</artifactId>        <version>${spring.version}</version>    </dependency>    <dependency>        <groupId>org.springframework</groupId>        <artifactId>spring-tx</artifactId>        <version>${spring.version}</version>    </dependency>    <dependency>        <groupId>org.springframework</groupId>        <artifactId>spring-jdbc</artifactId>        <version>${spring.version}</version>    </dependency>    <dependency>        <groupId>org.springframework</groupId>        <artifactId>spring-orm</artifactId>        <version>${spring.version}</version>    </dependency>    <dependency>        <groupId>org.springframework</groupId>        <artifactId>spring-oxm</artifactId>        <version>${spring.version}</version>    </dependency>    <dependency>        <groupId>org.springframework</groupId>        <artifactId>spring-web</artifactId>        <version>${spring.version}</version>    </dependency>

1、spring配置
hibernate没有单独用配置文件,全部集中在Spring配置文件中,采用了Druid数据连接池(网上说是最好的连接池),配置在Spring中。
(1)配置数据连接池:

<!-- 加载jdbc.properties文件 -->    <context:property-placeholder location="classpath:jdbc/jdbc.properties" /><!-- 配置数据源   Druid -->    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"        destroy-method="close">        <property name="url" value="${jdbcUrl}" />        <property name="driverClassName" value="${jdbcDriverClassName}" />        <property name="username" value="${jdbcUsername}" />        <property name="password" value="${jdbcPassword}" />        <property name="initialSize" value="${jdbcInitialSize}" />        <property name="maxActive" value="${jdbcMaxActive}" />        <property name="maxWait" value="${jdbcMaxWait}" />    </bean>

首先加载jdbc.properties,在文件中编写,可以有利于控制不同数据库。
(2)配置sessionFactory:

<!-- 配置sessionFactory -->    <bean id="sessionFactory"        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">        <property name="dataSource" ref="dataSource" />        <property name="hibernateProperties">            <props>                <prop key="hibernate.dialect">${hibernate.dialect}</prop>                <prop key="hibernate.show_sql">true</prop>                <prop key="hiberante.format_sql">true</prop>                <prop key="hibernate.autoReconnect">true</prop>                <prop key="hibernate.hbm2ddl.auto">update</prop>            </props>        </property>        <!--注解方式-->        <!-- 扫描实体类注解,将会被解析成classpath:com/epoint/oa/*/domain/*.class -->        <property name="packagesToScan">            <value>com.epoint.oa.*.domain</value>        </property>        <!--xxx.hbm.xml方式-->        <!-- <property name="mappingDirectoryLocations">            <list>                <value>classpath:com/epoint/oa/person/domain</value>            </list>        </property> -->    </bean>

注意,在hibernate3的时候需要配置,而hibernate4不能配置,hibernate4不用hibernateTamplate,用getCurrentSession:

<!-- hibernate4不能配置下面的东西 -->                <!-- <prop key="hibernate.current_session_context_class">thread</prop> -->

(3)配置声明式事务管理:

<!-- 事务管理 -->    <bean id="txManager"        class="org.springframework.orm.hibernate4.HibernateTransactionManager">        <property name="sessionFactory" ref="sessionFactory" />    </bean><!--开启注解支持-->    <tx:annotation-driven transaction-manager="txManager"/>

hibernate4配置了事务必须在方法上加上@Transactional注解,必须在有事务的情况下才能执行,否则将会报以下错误:
org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread
而且Dao层需要用sessionFactory.getCurrentSession,如果用openSession的话这增删改不成功,因为没有事务支持,需要手动开事务。
2、hibernate注解的配置
以一个Person实体类为例进行注解配置:

@Entity@Table(name="t_table")public class Person implements Serializable{    private static final long serialVersionUID = -3644583604873429694L;    @Id    @GeneratedValue(generator="uuid")    @GenericGenerator(name = "uuid", strategy = "uuid")    private String pid;    @Column(name="name",nullable=false,length=40)    private String name;    @Column(name="sex",nullable=false,length=40)    private String sex;    public String getPid() {        return pid;    }    public void setPid(String pid) {        this.pid = pid;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getSex() {        return sex;    }    public void setSex(String sex) {        this.sex = sex;    }}

!—–查找资料很多说@Id,@Column属性必须配置到getXXX方法上,但是亲测放在属性上面也可以。。
注意——-
导包不能导入hibernate的包需要导入javax.persistence中的包:

import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.Table;
原创粉丝点击