博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
pring3、hibernate4、JPA整合(包括很久未解决的事务管理问题)
阅读量:5883 次
发布时间:2019-06-19

本文共 26464 字,大约阅读时间需要 88 分钟。

  hot3.png

<p>Spring3、hibernate4、JPA配置在自己的电脑上试了下,没有找到事务管理解决的办法,今天图书馆看书,参考书里面的配置解决了事务管理问题,在此记录,顺便与诸君共享</p> <p><strong>首先是applicationContext的配置文件:</strong></p> <p><font color="#0000ff">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; <br />&lt;beans xmlns=&quot;</font><a href="http://www.springframework.org/schema/beans&quot;"><font color="#0000ff">http://www.springframework.org/schema/beans&quot;</font></a> <br /><font color="#0000ff">&#160;&#160;&#160; xmlns:xsi=&quot;</font><a href="http://www.w3.org/2001/XMLSchema-instance&quot;"><font color="#0000ff">http://www.w3.org/2001/XMLSchema-instance&quot;</font></a><font color="#0000ff"> xmlns:p=&quot;</font><a href="http://www.springframework.org/schema/p&quot;"><font color="#0000ff">http://www.springframework.org/schema/p&quot;</font></a> <br /><font color="#0000ff">&#160;&#160;&#160; xmlns:context=&quot;</font><a href="http://www.springframework.org/schema/context&quot;"><font color="#0000ff">http://www.springframework.org/schema/context&quot;</font></a> <br /><font color="#0000ff">&#160;&#160;&#160; xmlns:aop=&quot;</font><a href="http://www.springframework.org/schema/aop&quot;"><font color="#0000ff">http://www.springframework.org/schema/aop&quot;</font></a><font color="#0000ff"> xmlns:tx=&quot;</font><a href="http://www.springframework.org/schema/tx&quot;"><font color="#0000ff">http://www.springframework.org/schema/tx&quot;</font></a> <br /><font color="#0000ff">&#160;&#160;&#160; xsi:schemaLocation=&quot;</font><a href="http://www.springframework.org/schema/beans"><font color="#0000ff">http://www.springframework.org/schema/beans</font></a><font color="#0000ff"> </font><a href="http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"><font color="#0000ff">http://www.springframework.org/schema/beans/spring-beans-2.5.xsd</font></a><font color="#0000ff">&#160;&#160; <br />&#160;&#160;&#160; </font><a href="http://www.springframework.org/schema/context"><font color="#0000ff">http://www.springframework.org/schema/context</font></a><font color="#0000ff"> </font><a href="http://www.springframework.org/schema/context/spring-context-2.5.xsd"><font color="#0000ff">http://www.springframework.org/schema/context/spring-context-2.5.xsd</font></a><font color="#0000ff">&#160;&#160; <br />&#160;&#160;&#160; </font><a href="http://www.springframework.org/schema/aop"><font color="#0000ff">http://www.springframework.org/schema/aop</font></a><font color="#0000ff"> </font><a href="http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"><font color="#0000ff">http://www.springframework.org/schema/aop/spring-aop-2.5.xsd</font></a><font color="#0000ff">&#160;&#160; <br />&#160;&#160;&#160; </font><a href="http://www.springframework.org/schema/tx"><font color="#0000ff">http://www.springframework.org/schema/tx</font></a><font color="#0000ff"> </font><a href="http://www.springframework.org/schema/tx/spring-tx-2.5.xsd&quot;"><font color="#0000ff">http://www.springframework.org/schema/tx/spring-tx-2.5.xsd&quot;</font></a><font color="#0000ff">&gt;</font></p> <p><font color="#0000ff">&#160;&#160;&#160; &lt;!-- 数据源定义,使用Apache c3p0 连接池 --&gt; <br />&#160;&#160;&#160; &lt;bean id=&quot;dataSource&quot; class=&quot;com.mchange.v2.c3p0.ComboPooledDataSource&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; destroy-method=&quot;close&quot;&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;property name=&quot;driverClass&quot; value=&quot;com.mysql.jdbc.Driver&quot; /&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;property name=&quot;jdbcUrl&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; value=&quot;jdbc:mysql://localhost:3306/zjgcmcc?useUnicode=true&amp;amp;characterEncoding=utf-8&quot; /&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;property name=&quot;user&quot; value=&quot;root&quot; /&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;property name=&quot;password&quot; value=&quot;sunkai&quot; /&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;property name=&quot;checkoutTimeout&quot; value=&quot;5000&quot; /&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;property name=&quot;minPoolSize&quot; value=&quot;2&quot; /&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;property name=&quot;maxPoolSize&quot; value=&quot;10&quot; /&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;property name=&quot;maxStatements&quot; value=&quot;100&quot; /&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;property name=&quot;acquireIncrement&quot; value=&quot;2&quot; /&gt; <br />&#160;&#160;&#160; &lt;/bean&gt; <br />&#160;&#160; </font><font color="#ff0000">&lt;!-- 将 EntityManager 对象注射到标有 @PersistenceContext 的属性上 --&gt; <br />&#160;&#160;&#160; &lt;bean class=&quot;org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor&quot; /&gt; <br /></font><font color="#0000ff">&#160;&#160;&#160; &lt;!-- EntityManagerFanctory 对象,用户产生EntityManager --&gt; <br />&#160;&#160;&#160; &lt;bean id=&quot;entityManagerFactory&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; class=&quot;org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean&quot; destroy-method=&quot;destroy&quot;&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;property name=&quot;dataSource&quot; ref=&quot;dataSource&quot; /&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;property name=&quot;persistenceUnitName&quot; value=&quot;hibernateJPA&quot; /&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;property name=&quot;jpaVendorAdapter&quot;&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;bean class=&quot;org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter&quot;&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;property name=&quot;showSql&quot; value=&quot;true&quot; /&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;property name=&quot;generateDdl&quot; value=&quot;true&quot; /&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/bean&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/property&gt; <br />&#160;&#160;&#160; &lt;/bean&gt; <br />&#160;&#160;&#160; &lt;!-- 事务管理配置 --&gt; <br />&#160;&#160;&#160; &lt;bean id=&quot;transactionManager&quot; class=&quot;org.springframework.orm.jpa.JpaTransactionManager&quot;&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;property name=&quot;entityManagerFactory&quot; ref=&quot;entityManagerFactory&quot; /&gt; <br />&#160;&#160;&#160; &lt;/bean&gt; <br />&#160;&#160;&#160; &lt;!-- 将事务管理配置到有@Trancactional 的类、方法上 <br />&#160;&#160;&#160; &lt;tx:annotation-driven transaction-manager=&quot;transactionManager&quot; /&gt; <br />&#160;&#160;&#160;&#160; --&gt; <br />&#160;&#160;&#160; &lt;tx:advice id=&quot;transactionAdvice&quot; transaction-manager=&quot;transactionManager&quot;&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;tx:attributes&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;tx:method name=&quot;add*&quot; propagation=&quot;REQUIRED&quot;/&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;tx:method name=&quot;remove*&quot; propagation=&quot;REQUIRED&quot;/&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;tx:method name=&quot;delete*&quot; propagation=&quot;REQUIRED&quot;/&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;tx:method name=&quot;update*&quot; propagation=&quot;REQUIRED&quot;/&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;tx:method name=&quot;*&quot; propagation=&quot;SUPPORTS&quot; read-only=&quot;true&quot; /&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/tx:attributes&gt; <br />&#160;&#160;&#160; &lt;/tx:advice&gt; <br />&#160;&#160;&#160; &lt;aop:config&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;aop:pointcut id=&quot;businessService&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; expression=&quot;execution(* zjgcmcc.web.service.*.*(..))&quot; /&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;aop:advisor advice-ref=&quot;transactionAdvice&quot; pointcut-ref=&quot;businessService&quot; /&gt; <br />&#160;&#160;&#160; &lt;/aop:config&gt;</font></p> <p><font color="#0000ff">&#160;&#160;&#160; &lt;!--引入dao、service及其他bean设置--&gt; <br />&#160;&#160;&#160; &lt;import resource=&quot;beans.xml&quot; /&gt; <br />&lt;/beans&gt;</font></p> <p><font color="#000000"> Dao类、Service类、Controller类及其他bean配置在一个单独的beans.xml文件中:</font></p> <p><font color="#0000ff">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; <br />&lt;beans xmlns=&quot;</font><a href="http://www.springframework.org/schema/beans&quot;"><font color="#0000ff">http://www.springframework.org/schema/beans&quot;</font></a> <br /><font color="#0000ff">&#160;&#160;&#160; xmlns:xsi=&quot;</font><a href="http://www.w3.org/2001/XMLSchema-instance&quot;"><font color="#0000ff">http://www.w3.org/2001/XMLSchema-instance&quot;</font></a> <br /><font color="#0000ff">&#160;&#160;&#160; xsi:schemaLocation=&quot;</font><a href="http://www.springframework.org/schema/beans"><font color="#0000ff">http://www.springframework.org/schema/beans</font></a><font color="#0000ff"> </font><a href="http://www.springframework.org/schema/beans/spring-beans.xsd&quot;"><font color="#0000ff">http://www.springframework.org/schema/beans/spring-beans.xsd&quot;</font></a><font color="#0000ff">&gt; <br />&#160;&#160;&#160; &lt;!-- 基于JPA的通用基础Dao --&gt; <br />&#160;&#160;&#160; &lt;bean id=&quot;baseDao&quot; class=&quot;zjgcmcc.web.dao.impl.BaseDao&quot;&gt;&lt;/bean&gt; <br />&#160;&#160;&#160; <br />&#160;&#160;&#160; &lt;bean id=&quot;userService&quot; class=&quot;zjgcmcc.web.service.UserService&quot;&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;property name=&quot;userDao&quot; ref=&quot;baseDao&quot;&gt;&lt;/property&gt; <br />&#160;&#160;&#160; &lt;/bean&gt;</font></p> <p><font color="#0000ff">&lt;/beans&gt;</font></p> <p><font color="#000000"><strong>此处是persistence.xml的文件配置:</strong></font></p> <p><font color="#0000ff">&lt;?xml version=&quot;1.0&quot;?&gt; <br />&lt;persistence xmlns=&quot;</font><a href="http://java.sun.com/xml/ns/persistence&quot;"><font color="#0000ff">http://java.sun.com/xml/ns/persistence&quot;</font></a><font color="#0000ff"> version=&quot;1.0&quot; <br />&#160;&#160;&#160; xmlns:xsi=&quot;</font><a href="http://www.w3.org/2001/XMLSchema-instance&quot;"><font color="#0000ff">http://www.w3.org/2001/XMLSchema-instance&quot;</font></a> <br /><font color="#0000ff">&#160;&#160;&#160; xsi:schemaLocation=&quot;</font><a href="http://java.sun.com/xml/ns/persistence"><font color="#0000ff">http://java.sun.com/xml/ns/persistence</font></a><font color="#0000ff"> </font><a href="http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd&quot;"><font color="#0000ff">http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd&quot;</font></a><font color="#0000ff"> &gt; <br />&#160;&#160;&#160; &lt;persistence-unit name=&quot;hibernateJPA&quot; transaction-type=&quot;RESOURCE_LOCAL&quot;&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;provider&gt;org.hibernate.ejb.HibernatePersistence&lt;/provider&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;!-- entity classes --&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;class&gt;zjgcmcc.web.entity.Order&lt;/class&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;class&gt;zjgcmcc.web.entity.BaseEntity&lt;/class&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;class&gt;zjgcmcc.web.entity.TB_Dept&lt;/class&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;class&gt;zjgcmcc.web.entity.TB_User&lt;/class&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;class&gt;zjgcmcc.web.entity.TB_Role&lt;/class&gt;</font></p> <p><font color="#0000ff">&lt;!-- 下方为hibernate的一些属性设置--&gt;</font><font color="#0000ff"> <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font><font color="#0000ff">&lt;properties&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;property name=&quot;hibernate.dialect&quot; value=&quot;org.hibernate.dialect.MySQL5Dialect&quot; /&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;property name=&quot;hibernate.max_fetch_depth&quot; value=&quot;3&quot; /&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;property name=&quot;hibernate.hbm2ddl.auto&quot; value=&quot;update&quot; /&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;property name=&quot;hibernate.jdbc.fetch_size&quot; value=&quot;18&quot; /&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;property name=&quot;hibernate.jdbc.batch_size&quot; value=&quot;10&quot; /&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;property name=&quot;hibernate.show_sql&quot; value=&quot;true&quot; /&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;property name=&quot;hibernate.format_sql&quot; value=&quot;true&quot; /&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/properties&gt; <br />&#160;&#160;&#160; &lt;/persistence-unit&gt; <br />&lt;/persistence&gt;</font></p> <font color="#0000ff"> <p><font color="#000000"><strong>来看看通用的Dao类的写法:</strong></font></p> <p><font color="#000000">接口:IBaseDao.java</font></p> <p>package zjgcmcc.web.dao;</p> <p>import java.io.Serializable; <br />import java.util.List; <br />public interface IBaseDao&lt;T,ID extends Serializable&gt; { <br />&#160;&#160;&#160; public T findById(T t,ID id); <br />&#160;&#160;&#160; public List&lt;T&gt; query(String sql,T t); <br />&#160;&#160;&#160; public int add(T object); <br />&#160;&#160;&#160; public int update(T object); <br />&#160;&#160;&#160; public int update(String sql); <br />&#160;&#160;&#160; public int delete(T object); <br />&#160;&#160;&#160; public void flush(); <br />}</p> <p><font color="#000000">Dao的接口实现类:BaseDao.java</font></p> <p>package zjgcmcc.web.dao.impl;</p> <p>import java.io.Serializable; <br />import java.util.List;</p> <p>import javax.persistence.EntityManager; <br />import javax.persistence.PersistenceContext;</p> <p>import zjgcmcc.web.dao.IBaseDao;</p> <p>public class BaseDao&lt;T extends Serializable, ID extends Serializable&gt; implements IBaseDao&lt;T, ID&gt; { <br />&#160;&#160;&#160; <font color="#ff0000">@PersistenceContext <br />&#160;&#160;&#160; private EntityManager entityManager;</font></p> <p>&#160;&#160;&#160; @Override <br />&#160;&#160;&#160; public T findById(T t, ID id) { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; // TODO Auto-generated method stub <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; T find = (T) this.entityManager.find(t.getClass(), id); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; return find; <br />&#160;&#160;&#160; }</p> <p>&#160;&#160;&#160; @Override <br />&#160;&#160;&#160; public List&lt;T&gt; query(String sql, T t) { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; // TODO Auto-generated method stub <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; return this.entityManager.createNativeQuery(sql,t.getClass()) <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .getResultList(); <br />&#160;&#160;&#160; }</p> <p>&#160;&#160;&#160; @Override <br />&#160;&#160;&#160; public int add(T object) { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; // TODO Auto-generated method stub <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; int result = 1; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; try { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.entityManager.persist(object); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } catch (Exception e) { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; result = 0; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; return result;</p> <p>&#160;&#160;&#160; }</p> <p>&#160;&#160;&#160; @Override <br />&#160;&#160;&#160; public int update(T object) { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; // TODO Auto-generated method stub</p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; int result = 1; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; try { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.entityManager.merge(object); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } catch (Exception e) { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; result = 0; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; return result; <br />&#160;&#160;&#160; }</p> <p>&#160;&#160;&#160; @Override <br />&#160;&#160;&#160; public int update(String sql) { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; // TODO Auto-generated method stub <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; return 0; <br />&#160;&#160;&#160; }</p> <p>&#160;&#160;&#160; @Override <br />&#160;&#160;&#160; public int delete(T object) { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; // TODO Auto-generated method stub <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; try { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.entityManager.remove(object); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return 1; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } catch (Exception e) { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return 0; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p> <p>&#160;&#160;&#160; }</p> <p>&#160;&#160;&#160; @Override <br />&#160;&#160;&#160; public void flush() { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; // TODO Auto-generated method stub <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.entityManager.flush(); <br />&#160;&#160;&#160; } <br />}</p> <p><font color="#000000"><strong>接下来是一个业务层Service类:UserService.java</strong></font></p> <p>package zjgcmcc.web.service; <br />import zjgcmcc.web.dao.impl.BaseDao; <br />import zjgcmcc.web.entity.TB_User;</p> <p>public class UserService { <br />&#160;&#160;&#160; private BaseDao&lt;TB_User,String&gt; userDao; <br />&#160;&#160;&#160; <br />&#160;&#160;&#160; public BaseDao&lt;TB_User, String&gt; getUserDao() { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; return userDao; <br />&#160;&#160;&#160; } <br />&#160;&#160;&#160; public void setUserDao(BaseDao&lt;TB_User, String&gt; userDao) { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.userDao = userDao; <br />&#160;&#160;&#160; }</p> <p> <br />&#160;&#160;&#160; public void addUser(TB_User user){ <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.userDao.add(user); <br />&#160;&#160;&#160; } <br />} <br /><strong><font color="#000000">最后是一个单元测试:UserJPATest.java</font></strong></p> <p>package test; <br />import java.util.ArrayList; <br />import java.util.List; <br />import javax.persistence.EntityManager; <br />import javax.persistence.EntityManagerFactory; <br />import org.junit.Test; <br />import org.junit.runner.RunWith; <br />import org.springframework.beans.factory.annotation.Autowired; <br />import org.springframework.orm.jpa.JpaTransactionManager; <br />import org.springframework.test.context.ContextConfiguration; <br />import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; <br />import zjgcmcc.web.entity.TB_Dept; <br />import zjgcmcc.web.entity.TB_Role; <br />import zjgcmcc.web.entity.TB_User; <br />import zjgcmcc.web.service.UserService;</p> <p>@RunWith(SpringJUnit4ClassRunner.class) <br />@ContextConfiguration(&quot;classpath:applicationContext.xml&quot;) <br />public class UserJPATest { <br />&#160;&#160;&#160; @Autowired private UserService userService; <br />&#160;&#160;&#160; @Autowired EntityManagerFactory emf; <br />&#160;&#160;&#160; @Autowired JpaTransactionManager transactionManager; <br />&#160;&#160;&#160; <br />&#160;&#160;&#160; @Test public void test(){ <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; TB_Dept dept=new TB_Dept(); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; TB_Role role=new TB_Role(); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; TB_User user=new TB_User(); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; dept.setD_id(&quot;03&quot;); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; dept.setD_name(&quot;第三分中心&quot;); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; role.setR_id(&quot;0301&quot;); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; role.setR_name(&quot;主任&quot;); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; role.setR_dept(dept); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; List&lt;TB_Role&gt; roles=new ArrayList&lt;TB_Role&gt;(); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; roles.add(role); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; user.setU_id(&quot;030100&quot;); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; user.setU_name(&quot;A&quot;); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; user.setU_roles(roles); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println((userService==null)); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.userService.addUser(user); <br />&#160;&#160;&#160; } <br />}</p> <p><strong><font color="#000000">三个Entity类:</font></strong></p> <p><strong>TB_Dept.java:</strong></p> <p>package zjgcmcc.web.entity; <br />import java.util.HashSet; <br />import java.util.Set;</p> <p>import javax.persistence.CascadeType; <br />import javax.persistence.Column; <br />import javax.persistence.Entity; <br />import javax.persistence.FetchType; <br />import javax.persistence.Id; <br />import javax.persistence.JoinColumn; <br />import javax.persistence.JoinTable; <br />import javax.persistence.ManyToMany; <br />import javax.persistence.ManyToOne; <br />import javax.persistence.Table;</p> <p> <br />@Entity <br />@Table(name=&quot;tb_dept&quot;) <br />public class TB_Dept extends BaseEntity{ <br />&#160;&#160;&#160; private static final long serialVersionUID = -1844975459250411764L; <br />&#160;&#160;&#160; @Id <br />&#160;&#160;&#160; @Column(name=&quot;d_id&quot;) <br />&#160;&#160;&#160; <br />&#160;&#160;&#160; private String d_id; <br />&#160;&#160;&#160; @Column(name=&quot;d_name&quot;) <br />&#160;&#160;&#160; private String d_name; <br />&#160;&#160;&#160; @Column(name=&quot;d_level&quot;,nullable=false) <br />&#160;&#160;&#160; private int d_level;</p> <p>//getter setter略….&#160;&#160;&#160; <br />} <br /></p> <p><strong>TB_Role.java:</strong></p> <p>package zjgcmcc.web.entity;</p> <p>import javax.persistence.CascadeType; <br />import javax.persistence.Column; <br />import javax.persistence.Entity; <br />import javax.persistence.FetchType; <br />import javax.persistence.Id; <br />import javax.persistence.JoinColumn; <br />import javax.persistence.JoinTable; <br />import javax.persistence.ManyToMany; <br />import javax.persistence.ManyToOne; <br />import javax.persistence.OneToMany; <br />import javax.persistence.OneToOne; <br />import javax.persistence.PrimaryKeyJoinColumn; <br />import javax.persistence.Table;</p> <p>@Entity <br />@Table(name=&quot;tb_role&quot;) <br />public class TB_Role extends BaseEntity{ <br />&#160;&#160;&#160; private static final long serialVersionUID = 3618646459702991344L; <br />&#160;&#160;&#160; @Id <br />&#160;&#160;&#160; @Column(name=&quot;r_id&quot;) <br />&#160;&#160;&#160; private String r_id; <br />&#160;&#160;&#160; @Column(name=&quot;r_name&quot;) <br />&#160;&#160;&#160; private String r_name; <br />&#160;&#160;&#160; <br />&#160;&#160;&#160; @ManyToOne(fetch=FetchType.EAGER,cascade={CascadeType.PERSIST}) <br />&#160;&#160;&#160; @JoinColumn(name=&quot;dept_id&quot;,unique=true) <br />&#160;&#160;&#160; private TB_Dept r_dept; <br /> //getter setter略…. <br />} <br /></p> <p><strong>TB_User.java:</strong></p> <p>package zjgcmcc.web.entity; <br />import java.util.ArrayList; <br />import java.util.HashSet; <br />import java.util.List;</p> <p>import java.util.Set;</p> <p>import javax.persistence.CascadeType; <br />import javax.persistence.Column; <br />import javax.persistence.Entity; <br />import javax.persistence.FetchType; <br />import javax.persistence.Id; <br />import javax.persistence.JoinColumn; <br />import javax.persistence.JoinTable; <br />import javax.persistence.ManyToMany; <br />import javax.persistence.OneToMany; <br />import javax.persistence.Table;</p> <p>@Entity <br />@Table(name=&quot;tb_user&quot;) <br />public class TB_User extends BaseEntity { <br />&#160;&#160;&#160; private static final long serialVersionUID = 7665797019787902828L; <br />&#160;&#160;&#160; @Id <br />&#160;&#160;&#160; @Column(name=&quot;u_id&quot;) <br />&#160;&#160;&#160; private String u_id; <br />&#160;&#160;&#160; @Column(name=&quot;u_name&quot;) <br />&#160;&#160;&#160; private String u_name; <br />&#160;&#160;&#160; //tb_user与tb_dept的多对多关系 <br />&#160;&#160;&#160; @ManyToMany(fetch=FetchType.EAGER,cascade={CascadeType.PERSIST}) <br />&#160;&#160;&#160; @JoinTable( <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; name=&quot;tb_user_role&quot;, <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; joinColumns=@JoinColumn(name=&quot;user_id&quot;,referencedColumnName=&quot;u_id&quot;), <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; inverseJoinColumns=@JoinColumn(name=&quot;role_id&quot;,referencedColumnName=&quot;r_id&quot;) <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ) <br />&#160;&#160;&#160; private List&lt;TB_Role&gt; u_roles=new ArrayList&lt;TB_Role&gt;(); <br />&#160;&#160;&#160; <br />&#160;&#160;&#160; @Column(name=&quot;u_phone&quot;) <br />&#160;&#160;&#160; private String u_phone; <br />&#160;&#160;&#160; @Column(name=&quot;u_passwd&quot;) <br />&#160;&#160;&#160; private String u_passwd;</p> <p>//getter setter略…. </p> <p>} <br /></p> <p><font color="#000000">红字部分在配置的时候容易被忽略或配置错误,具体为何配置尚未研究,有达人了解欢迎指点一二 。</font></p> <p> <br /></p> <p><font color="#000000"></font> <br /></p> </font>

转载于:https://my.oschina.net/jaakan/blog/155964

你可能感兴趣的文章
jmeter插件之jsonpath提取响应结果和做断言
查看>>
推荐系统那点事 —— 基于Spark MLlib的特征选择
查看>>
linux 下RTL8723/RTL8188调试记录(命令行)【转】
查看>>
[Contiki系列论文之1]Contiki——为微传感器网络而生的轻量级的、灵活的操作系统...
查看>>
Android 网络编程 记录
查看>>
微软同步发行Windows 10和Windows 10 Mobile系统更新
查看>>
Zeppelin的入门使用系列之使用Zeppelin运行shell命令(二)
查看>>
form表单下的button按钮会自动提交表单的问题
查看>>
那些年追过的......写过的技术博客
查看>>
python基础教程_学习笔记19:标准库:一些最爱——集合、堆和双端队列
查看>>
CSS魔法堂:Transition就这么好玩
查看>>
解决win7远程桌面连接时发生身份验证错误的方法
查看>>
C/C++ 多线程机制
查看>>
Boost在vs2010下的配置
查看>>
一起谈.NET技术,ASP.NET伪静态的实现及伪静态的意义
查看>>
string::c_str()、string::c_data()及string与char *的正确转换
查看>>
11G数据的hive初测试
查看>>
如何使用Core Text计算一段文本绘制在屏幕上之后的高度
查看>>
==和equals区别
查看>>
2010技术应用计划
查看>>