pring三、hibernate四、JPA整合(包括好久未解決的事務管理問題)

<p>Spring三、hibernate四、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>java

相關文章
相關標籤/搜索