你的位置:首页 > ASP.net教程

[ASP.net教程]整合Spring与Hibernate


在学习spring的时候,要整合hibernate,本来是看起来挺简单的,但是遇到的远要比想到了多,而且多很多,
期间几天一个bug实在难调,几度放弃,但终究柳暗花明,抑制不住喜悦就想着分享一下成果吧。

1、实体类 User:

 1 import java.util.Date; 2  3 import javax.persistence.Column; 4 import javax.persistence.Entity; 5 import javax.persistence.GeneratedValue; 6 import javax.persistence.GenerationType; 7 import javax.persistence.Id; 8 import javax.persistence.Temporal; 9 import javax.persistence.TemporalType;10 11 @Entity12 public class User {13 14   @Id15   @Column(name="user_id")16   @GeneratedValue(strategy=GenerationType.IDENTITY)17   private Integer id;18   @Column(name="user_name")19   private String name;20   private String pass;21   @Temporal(TemporalType.DATE)22   private Date birth;23   24   25   26   public User() {27     28   }29   30   31   public User( String name, String pass, Date birth) {32     super();33     this.name = name;34     this.pass = pass;35     this.birth = birth;36   }37   38   public Integer getId() {39     return id;40   }41 42 43   public void setId(Integer id) {44     this.id = id;45   }46 47 48   public String getName() {49     return name;50   }51   public void setName(String name) {52     this.name = name;53   }54   public String getPass() {55     return pass;56   }57   public void setPass(String pass) {58     this.pass = pass;59   }60 61 62   public Date getBirth() {63     return birth;64   }65 66 67   public void setBirth(Date birth) {68     this.birth = birth;69   }70   71   72 }

 



2、hibernate配置文件hibernate.cfg.

 1 <? 2 <!DOCTYPE hibernate-configuration PUBLIC 3     "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 4     "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 5  6 <hibernate-configuration> 7  8   <session-factory> 9     <!-- hibernate 所需的配置信息 -->10     <property name="show_sql">true</property>11     <property name="dialect">org.hibernate.dialect.MySQLDialect</property><!--方言-->12     <property name="format_sql">true</property>13     <property name="hbm2ddl.auto">update</property>14     15     <!-- hibernate 指定映射类 -->16     <mapping class="com.csu.domain.User"/>17     18   </session-factory>19   20 </hibernate-configuration>

 



3、c3p0数据库连接池所需要的数据库配置信息,放置在jdbc.properties文件中,这样也方便日后修改只需要改动属性文件,
而不需要改动配置文件:

user=rootpassword=7890driverClass=com.mysql.jdbc.DriverjdbcUrl=jdbc:mysql://localhost:3306/springmaxPoolSize=200minPoolSize=2initialPoolSize=2

 



4、spring的配置文件beans.

 1 <? 2  3 <!-- 整个Spring 文件的根元素就是beans --> 4 <beans  5  6  7  8    9   xsi:schemaLocation="http://www.springframework.org/schema/beans10     http://www.springframework.org/schema/beans/spring-beans.xsd11     12     http://www.springframework.org/schema/util13     http://www.springframework.org/schema/util/spring-util.xsd14     15     http://www.springframework.org/schema/context16     http://www.springframework.org/schema/context/spring-context.xsd17     ">18 19    <!-- *****************配置数据源*********************** -->20    21    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">22    23      <property name="locations">24        <!-- 列出需要读取的属性文件 -->25        <list>26          <value>classpath:jdbc.properties</value>27        </list>28      </property>29        30    </bean>31      32    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"33      p:user="${user}"34      p:password="${password}"35      p:driver36      p:jdbcUrl="${jdbcUrl}"37      p:maxPoolSize="${maxPoolSize}"38      p:minPoolSize="${minPoolSize}"39      p:initialPoolSize="${initialPoolSize}"40    />41    <!-- *****************配置数据源*********************** -->42   43   <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"44   p:dataSource-ref="dataSource"45   p:configLocation="classpath:hibernate.cfg.46   />47   <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"48   p:sessionFactory-ref="sessionFactory"49   />50     51 </beans>

 


5、测试主类:

 1 import java.util.Date; 2  3 import org.hibernate.FlushMode; 4 import org.springframework.context.ApplicationContext; 5 import org.springframework.context.support.ClassPath 6 import org.springframework.orm.hibernate3.HibernateTemplate; 7  8 import com.csu.domain.User; 9 10 public class SpHiTest {11 12   public static void main(String[] args) {13     ApplicationContext ctx = new ClassPath);14 15     //直接利用数据库的HibernateTemplate类进行数据库操作,可以极大方便了操作流程16     HibernateTemplate ht = (HibernateTemplate)ctx.getBean("hibernateTemplate");17 18     ht.save(new User("chen","123",new Date()));    19     20   }21 22   23 24 }

 

6、期间碰到的问题是一直出现这个问题:

Exception in thread "main" org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.  at org.springframework.orm.hibernate4.HibernateTemplate.checkWriteOperationAllowed(HibernateTemplate.java:1128)  at org.springframework.orm.hibernate4.HibernateTemplate$20.doInHibernate(HibernateTemplate.java:737)  at org.springframework.orm.hibernate4.HibernateTemplate.doExecute(HibernateTemplate.java:341)  at org.springframework.orm.hibernate4.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:309)  at org.springframework.orm.hibernate4.HibernateTemplate.persist(HibernateTemplate.java:734)  at com.csu.test.SpHiTest.main(SpHiTest.java:26)

 


反正无论怎么调都无法正确,最终还是将hibernate4版本换成了hibernate3才得以解决。最后的结果看一下: