﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-&lt;h3 style="font-family: Comic Sans MS"&gt;&lt;font color="#FA1A0A" size="10"&gt;︻┳═一Java&lt;/font&gt;&lt;/h3&gt;-随笔分类-Junit</title><link>http://www.blogjava.net/rain1102/category/37645.html</link><description>&lt;br/&gt;&lt;font color="green" style="font-family: 华文行楷;font-size:16px;"&gt;子曰：危邦不入，乱邦不居。天下有道则见，无道则隐。&lt;/font&gt;&lt;font color="#3C1435"&gt;&lt;/font&gt;</description><language>zh-cn</language><lastBuildDate>Fri, 06 Nov 2009 16:43:16 GMT</lastBuildDate><pubDate>Fri, 06 Nov 2009 16:43:16 GMT</pubDate><ttl>60</ttl><item><title>AbstractTransactionalJUnit4SpringContextTests中的事务回滚</title><link>http://www.blogjava.net/rain1102/archive/2009/11/04/301147.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Wed, 04 Nov 2009 12:58:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/11/04/301147.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/301147.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/11/04/301147.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/301147.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/301147.html</trackback:ping><description><![CDATA[今天同事问了一个问题，关于annotation配置多对多关联映射以后，创建新的对象时候，为什么多对多的关系没有保存到关系表中。具体问题如下：<br />
当前有一个User和一个Role，它们是多对多关系，中间表为user_role存放user和role的id。部分User代码如下：<br />
<span style="color: #008000">@ManyToMany(cascade = { CascadeType.PERSIST }, fetch = FetchType.LAZY)&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; @JoinTable(name = "user_role", <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;joinColumns = @JoinColumn(name = "user_id"), <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;inverseJoinColumns = @JoinColumn(name = "role_id"))&nbsp;&nbsp;&nbsp;&nbsp;</span><br />
&nbsp;public Set&lt;Role&gt; getRoles() {<br />
&nbsp;&nbsp;return roles;<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;public void setRoles(Set&lt;Role&gt; roles) {<br />
&nbsp;&nbsp;this.roles = roles;<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;public void addRole(Role role) {<br />
&nbsp;&nbsp;if (!this.roles.contains(role)) {<br />
&nbsp;&nbsp;&nbsp;this.roles.add(role);<br />
&nbsp;&nbsp;}<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;public void removeRole(Role role) {<br />
&nbsp;&nbsp;this.roles.remove(role);<br />
&nbsp;}<br />
<br />
Role中的部分代码如下：<br />
<span style="color: #008000">@ManyToMany(<br />
&nbsp;&nbsp;&nbsp;cascade = {CascadeType.PERSIST, CascadeType.MERGE},<br />
&nbsp;&nbsp;&nbsp;mappedBy = "roles",<br />
&nbsp;&nbsp;&nbsp;targetEntity = User.class<br />
&nbsp;&nbsp;&nbsp;)</span><br />
&nbsp;public Set&lt;User&gt; getUsers() {<br />
&nbsp;&nbsp;return users;<br />
&nbsp;}<br />
<br />
而测试代码继承了AbstractTransactionalJUnit4SpringContextTests，代码如下：<br />
&nbsp;@Test<br />
&nbsp;public void testManyToMany() {<br />
&nbsp;&nbsp;Role oneRole = new Role();<br />
&nbsp;&nbsp;oneRole.setDescription("manager");<br />
&nbsp;&nbsp;oneRole.setEnabled(true);<br />
&nbsp;&nbsp;oneRole.setRoleName("manger");<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;Role twoRole = new Role();<br />
&nbsp;&nbsp;twoRole.setDescription("waitress");<br />
&nbsp;&nbsp;twoRole.setEnabled(true);<br />
&nbsp;&nbsp;twoRole.setRoleName("waitress");<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;User user = new User();<br />
&nbsp;&nbsp;user.setEnabled(true);<br />
&nbsp;&nbsp;user.setPassword("jianghaiying");<br />
&nbsp;&nbsp;user.setUsername("Jiang HaiYing");<br />
&nbsp;&nbsp;user.addRole(oneRole);<br />
&nbsp;&nbsp;user.addRole(twoRole);<br />
&nbsp;&nbsp;userDAO.persist(user);<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;userDAO.getConnection().commit();<br />
&nbsp;&nbsp;} catch (SQLException e) {<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;}<br />
&nbsp;}<br />
这样执行以后，打印出的信息如下：<br />
Hibernate: insert into user (enabled, password, username) values (?, ?, ?)<br />
Hibernate: insert into role (description, enabled, name) values (?, ?, ?)<br />
Hibernate: insert into role (description, enabled, name) values (?, ?, ?)<br />
<br />
这时候问题出来了，为什么没有往关系表中插入数据？<br />
其实这并不是代码或者配置写错误了，在正式运行代码一切正常，而是AbstractTransactionalJUnit4SpringContextTests出的鬼，事实上多对多关联关系是由Hibernate去帮我们维护的，而AbstractTransactionalJUnit4SpringContextTests为了保持数据的清洁又会自动回滚。如何解决这个问题呢？<br />
方法：<br />
只需要在test方法上添加<span style="color: #008000">@Rollback(false)，</span>不让它回滚，一切正常了。这时候也可以去掉try语句了。<br />
Hibernate: insert into user (enabled, password, username) values (?, ?, ?)<br />
Hibernate: insert into role (description, enabled, name) values (?, ?, ?)<br />
Hibernate: insert into role (description, enabled, name) values (?, ?, ?)<br />
Hibernate: insert into user_role (user_id, role_id) values (?, ?)<br />
Hibernate: insert into user_role (user_id, role_id) values (?, ?)<img src ="http://www.blogjava.net/rain1102/aggbug/301147.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2009-11-04 20:58 <a href="http://www.blogjava.net/rain1102/archive/2009/11/04/301147.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>项目中封装Spring中的测试基类</title><link>http://www.blogjava.net/rain1102/archive/2008/04/21/194490.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Mon, 21 Apr 2008 05:15:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/04/21/194490.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/194490.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/04/21/194490.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/194490.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/194490.html</trackback:ping><description><![CDATA[<p>package com.founder.common;</p>
<p>import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.text.SimpleDateFormat;<br />
import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.util.TimeZone;</p>
<p>import org.hibernate.SessionFactory;<br />
import org.springframework.test.AbstractTransactionalDataSourceSpringContextTests;</p>
<p>/**<br />
&nbsp;* This class is the base class of all the tests, <br />
&nbsp;* we can use the dependency injection functionality of spring in all the tests,<br />
&nbsp;* and the default transaction mode is rollback, so we don't need to write special code to restore data after calling some methods affected database data. <br />
&nbsp;* <br />
&nbsp;* @author Rui Zhou, Copyright &#169; 2008 foundersoftware. All Rights Reserved.<br />
&nbsp;* @version 1.00, 2008-03-22 15:46<br />
&nbsp;*/<br />
public abstract class SpringTestCaseBase extends AbstractTransactionalDataSourceSpringContextTests {<br />
&nbsp;<br />
&nbsp;protected SimpleDateFormat sdf;<br />
&nbsp;<br />
&nbsp;public SpringTestCaseBase() {<br />
&nbsp;&nbsp;// query the protected variables to implement denpendency injection automatically,<br />
&nbsp;&nbsp;// so we don't need to write settor and gettor methods anymore.<br />
&nbsp;&nbsp;this.setPopulateProtectedVariables(true);<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;sdf = new SimpleDateFormat("yyyy-MM-dd");<br />
&nbsp;&nbsp;sdf.setTimeZone(TimeZone.getDefault());<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;protected String[] getConfigLocations() {<br />
&nbsp;&nbsp;return new String[] { "file:WebRoot/WEB-INF/applicationContext*.xml"};<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
&nbsp;protected void flushSession(){<br />
&nbsp;&nbsp;SessionFactory sessionFactory = (SessionFactory)applicationContext.getBean("sessionFactory");&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sessionFactory.getCurrentSession().flush();<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
</p><img src ="http://www.blogjava.net/rain1102/aggbug/194490.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-04-21 13:15 <a href="http://www.blogjava.net/rain1102/archive/2008/04/21/194490.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>