<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Schauderhaft &#187; hibernate</title>
	<atom:link href="http://blog.schauderhaft.de/tag/hibernate/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.schauderhaft.de</link>
	<description>Softwaredevelopment, Projectmanagement, Qualitymanagement and all things &#34;schauderhaft&#34;</description>
	<lastBuildDate>Sun, 05 Feb 2012 20:46:36 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Testing Databases with JUnit and Hibernate Part 3: Cleaning up and Further Ideas</title>
		<link>http://blog.schauderhaft.de/2011/03/27/testing-databases-with-junit-and-hibernate-part-3-cleaning-up-and-further-ideas/</link>
		<comments>http://blog.schauderhaft.de/2011/03/27/testing-databases-with-junit-and-hibernate-part-3-cleaning-up-and-further-ideas/#comments</comments>
		<pubDate>Sun, 27 Mar 2011 18:40:15 +0000</pubDate>
		<dc:creator>Jens Schauder</dc:creator>
				<category><![CDATA[Softwaredevelopment]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[junit]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://blog.schauderhaft.de/?p=741</guid>
		<description><![CDATA[This is the last part in this little series about testing of database code. In the first part I extracted the session handling for the tests into a JUnit Rule. In the second part I introduced ObjectMothers for easy creation of instances in the database. In this part I&#8217;ll simplify the implementation of new ObjectMothers [...]]]></description>
			<content:encoded><![CDATA[<p>This is the last part in this little series about testing of database code.<br />
In the first part I <a href="/2011/03/20/testing-databases-with-junit-and-hibernate-part-2-the-mother-of-all-things/">extracted the session handling for the tests</a> into a JUnit Rule.<br />
In the second part I introduced <a href="/2011/03/13/testing-databases-with-junit-and-hibernate-part-1-one-to-rule-them/">ObjectMothers for easy creation of instances</a> in the database.<br />
In this part I&#8217;ll simplify the implementation of new ObjectMothers by extracting two superclasses and I&#8217;ll finish by sketching some further ideas for further development.</p>
<p>Lets have a look at the SuperHeroMother</p>
<div class="geshi no java">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">class</span> SuperHeroMother <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> <span class="kw2">final</span> Session session<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> <span class="kw3">String</span> secretIdentity = <span class="st0">&quot;Mr. Jones&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> <span class="kw3">String</span> name = <span class="st0">&quot;Name&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> <span class="kw3">String</span> weakness = <span class="st0">&quot;None&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> SuperPower power = <span class="kw2">null</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> SuperHeroMother<span class="br0">&#40;</span>Session s<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; session = s<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; power = <span class="kw2">new</span> SuperPowerMother<span class="br0">&#40;</span>session<span class="br0">&#41;</span>.<span class="me1">instance</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> SuperHero instance<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; SuperHero hero = loadInstance<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>hero == <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;hero = createInstance<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; hero.<span class="me1">power</span> = power<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; hero.<span class="me1">weakness</span> = weakness<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; hero.<span class="me1">secretIdentity</span> = secretIdentity<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; session.<span class="me1">save</span><span class="br0">&#40;</span>hero<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">return</span> hero<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> SuperHero loadInstance<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">return</span> <span class="br0">&#40;</span>SuperHero<span class="br0">&#41;</span> session.<span class="me1">createCriteria</span><span class="br0">&#40;</span>SuperHero.<span class="kw2">class</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; .<span class="me1">add</span><span class="br0">&#40;</span>Restrictions.<span class="me1">eq</span><span class="br0">&#40;</span><span class="st0">&quot;name&quot;</span>, name<span class="br0">&#41;</span><span class="br0">&#41;</span>.<span class="me1">uniqueResult</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> SuperHero createInstance<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; SuperHero hero = <span class="kw2">new</span> SuperHero<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; hero.<span class="me1">name</span> = name<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">return</span> hero<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> SuperHeroMother name<span class="br0">&#40;</span><span class="kw3">String</span> aName<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; name = aName<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">return</span> <span class="kw2">this</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> SuperHeroMother secretIdentity<span class="br0">&#40;</span><span class="kw3">String</span> aSecretIdentity<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; secretIdentity = aSecretIdentity<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">return</span> <span class="kw2">this</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> SuperHeroMother power<span class="br0">&#40;</span>SuperPower aPower<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; power = aPower<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">return</span> <span class="kw2">this</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> SuperHeroMother weaknes<span class="br0">&#40;</span><span class="kw3">String</span> aWeakness<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; weakness = aWeakness<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">return</span> <span class="kw2">this</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>There is still quite some code wich will get repeated over and over again for each ObjectMother. So lets extract some of the commonalities into a superclass <tt>ObjectMother</tt>:</p>
<div class="geshi no java">
<ol>
<li class="li1">
<div class="de1"><span class="coMULTI">/** create instances of type &lt;tt&gt;T&lt;/tt&gt; */</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">abstract</span> <span class="kw2">class</span> ObjectMother<span class="sy0">&lt;</span>T<span class="sy0">&gt;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> <span class="kw2">final</span> Session session<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> ObjectMother<span class="br0">&#40;</span>Session s<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; session = s<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="coMULTI">/** returns an instance based on the configuration of this object mother */</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> T instance<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; T t = loadInstance<span class="br0">&#40;</span>session<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>t == <span class="kw2">null</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;t = createInstance<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; configureInstance<span class="br0">&#40;</span>t<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; session.<span class="me1">save</span><span class="br0">&#40;</span>t<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">return</span> t<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; * configure the instance &lt;tt&gt;t&lt;/tt&gt; according to the configuration of this</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; * ObjectMother</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; */</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">abstract</span> <span class="kw2">protected</span> <span class="kw4">void</span> configureInstance<span class="br0">&#40;</span>T t<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; * try to load an instance based on the alternate key. Returns null if no</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; * such instance exists</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; */</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">abstract</span> <span class="kw2">protected</span> T loadInstance<span class="br0">&#40;</span>Session session<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; * create a fresh instance with the alternate key set according to the</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; * configuration of this ObjectMother</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; */</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">abstract</span> <span class="kw2">protected</span> T createInstance<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p><tt>ObjectMother</tt> uses the <a href="http://en.wikipedia.org/wiki/Template_method_pattern">Template Method Pattern</a> in order to coordinate the provisioning of intances: try to load a matching instance from the database, if this doesn&#8217;t work, create it from scratch, configure all attributes of the instance, store it in the database and return it. The loading, creating and configuring needs to get implemented in subclasses.</p>
<p>For the three entities used in this series we can extract even more code from the various <tt>ObjectMothers</tt> because loading the instance from the database works always in exactly the same way. But this is only the case because we have an alternate key based on a single attribute. This will be often the case but not always, so I don&#8217;t want to tie this into the ObjectMother. Instead I&#8217;ll create another super class for this special kind of ObjectMother: <tt>SingleAlternateKeyObjectMother</tt></p>
<div class="geshi no java">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">abstract</span> <span class="kw2">class</span> SingleAlternateKeyObjectMother<span class="sy0">&lt;</span>T, A, S <span class="kw2">extends</span> SingleAlternateKeyObjectMother<span class="sy0">&lt;</span>T, A, S<span class="sy0">&gt;&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">extends</span> ObjectMother<span class="sy0">&lt;</span>T<span class="sy0">&gt;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> <span class="kw2">final</span> Class<span class="sy0">&lt;</span>T<span class="sy0">&gt;</span> objectType<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> <span class="kw2">final</span> <span class="kw3">String</span> alternateKeyName<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> A alternateKey<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> SingleAlternateKeyObjectMother<span class="br0">&#40;</span>Session s, Class<span class="sy0">&lt;</span>T<span class="sy0">&gt;</span> theObjectType,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;A defaultAlternateKey, <span class="kw3">String</span> theAlternateKeyName<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">super</span><span class="br0">&#40;</span>s<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; objectType = theObjectType<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; alternateKeyName = theAlternateKeyName<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; alternateKey<span class="br0">&#40;</span>defaultAlternateKey<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;@SuppressWarnings<span class="br0">&#40;</span><span class="st0">&quot;unchecked&quot;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;@Override</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">final</span> <span class="kw2">protected</span> T loadInstance<span class="br0">&#40;</span>Session session<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">return</span> <span class="br0">&#40;</span>T<span class="br0">&#41;</span> session.<span class="me1">createCriteria</span><span class="br0">&#40;</span>objectType<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; .<span class="me1">add</span><span class="br0">&#40;</span>Restrictions.<span class="me1">eq</span><span class="br0">&#40;</span>alternateKeyName, getAlternateKey<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; .<span class="me1">uniqueResult</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;@SuppressWarnings<span class="br0">&#40;</span><span class="st0">&quot;unchecked&quot;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> S alternateKey<span class="br0">&#40;</span>A theAlternateKey<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; alternateKey = theAlternateKey<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">return</span> <span class="br0">&#40;</span>S<span class="br0">&#41;</span> <span class="kw2">this</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> A getAlternateKey<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">return</span> alternateKey<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>With this a <tt>SuperHeroMother</tt> contains only a couple of extremly simple methods with hardly any code duplication left:</p>
<div class="geshi no java">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">class</span> SuperHeroMother <span class="kw2">extends</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; SingleAlternateKeyObjectMother<span class="sy0">&lt;</span>SuperHero, <span class="kw3">String</span>, SuperHeroMother<span class="sy0">&gt;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> <span class="kw3">String</span> secretIdentity = <span class="st0">&quot;Mr. Jones&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> <span class="kw3">String</span> weakness = <span class="st0">&quot;None&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> SuperPower power<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> SuperHeroMother<span class="br0">&#40;</span>Session s<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">super</span><span class="br0">&#40;</span>s, SuperHero.<span class="kw2">class</span>, <span class="st0">&quot;Name&quot;</span>, <span class="st0">&quot;name&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; power = <span class="kw2">new</span> SuperPowerMother<span class="br0">&#40;</span>s<span class="br0">&#41;</span>.<span class="me1">instance</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;@Override</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">protected</span> <span class="kw4">void</span> configureInstance<span class="br0">&#40;</span>SuperHero hero<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; hero.<span class="me1">power</span> = power<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; hero.<span class="me1">weakness</span> = weakness<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; hero.<span class="me1">secretIdentity</span> = secretIdentity<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;@Override</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">protected</span> SuperHero createInstance<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; SuperHero hero = <span class="kw2">new</span> SuperHero<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; hero.<span class="me1">name</span> = getAlternateKey<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">return</span> hero<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> SuperHeroMother secretIdentity<span class="br0">&#40;</span><span class="kw3">String</span> aSecretIdentity<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; secretIdentity = aSecretIdentity<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">return</span> <span class="kw2">this</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> SuperHeroMother power<span class="br0">&#40;</span>SuperPower aPower<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; power = aPower<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">return</span> <span class="kw2">this</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> SuperHeroMother weaknes<span class="br0">&#40;</span><span class="kw3">String</span> aWeakness<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; weakness = aWeakness<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">return</span> <span class="kw2">this</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Note that the three last methods are only necessary when you want to control these three attributes in your tests. Also these methods actually do suffer from code duplication, but I don&#8217;t see a way to abstract over this duplication without using lots of reflection which I don&#8217;t consider worthwhile in this case.</p>
<p>With this infrastructure setup there shouldn&#8217;t be a reason to leave any SQL statement untested. There are some special cases though.</p>
<p>As mentioned in the first part of this series you should use an in memory database for these tests. It is by orders of magnitudes faster then a normal persistent database. With an in memory database (HSQLDB) we execute about 400 tests in about 5 minutes in a current project. I consider this slow as mud for unit test standards, but compare it to 90 minutes for the same tests against an Oracle database. But sometimes you might have SQL statements that are specific for a database. For example we use analytic functions which are extremely powerfull, but not supported by HSQLDB and as far as I know by no other free in memory database. In order to test these statements and still have a fast running test suite, we further extended our session factory rule. It checks if a the test method or test class is annotated with a special annotation (@OracleTest) and also checks the SqlDialect of the HibernateConfiguration. If the annotation is present, but the SqlDialect is not an Oracle dialect it does not execute the test. Our continuos integration system (Jenkins) has two jobs for the test, one configured with an oracle database and one with a HSQLDB in memory database. The later gives a fast feedback for each check in into version control and the second runs the slow, but more complete tests.</p>
<p>While the stuff presented here is in my opinion extremely helpfull for unit tests of database access there are other things that need testing in the context of databases. You should especially consider tests for your ddl statements and performance tests. For tests of ddl statements I provided ideas in a former article. For performance tests the approach of ObjectMothers is at least in its current form mostly useless, because creating the large amounts of data would be way to slow. So special techniques are needed here. Maybe somebody can provide helpfull links in the comments?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.schauderhaft.de/2011/03/27/testing-databases-with-junit-and-hibernate-part-3-cleaning-up-and-further-ideas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Testing Databases with JUnit and Hibernate Part 2: The Mother of All Things</title>
		<link>http://blog.schauderhaft.de/2011/03/20/testing-databases-with-junit-and-hibernate-part-2-the-mother-of-all-things/</link>
		<comments>http://blog.schauderhaft.de/2011/03/20/testing-databases-with-junit-and-hibernate-part-2-the-mother-of-all-things/#comments</comments>
		<pubDate>Sun, 20 Mar 2011 09:55:47 +0000</pubDate>
		<dc:creator>Jens Schauder</dc:creator>
				<category><![CDATA[Softwaredevelopment]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[junit]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://blog.schauderhaft.de/?p=735</guid>
		<description><![CDATA[In the first part of this little series I showed a simple test based on a simple data model. As we saw the code for the test wasn&#8217;t simple at all, but quite ugly. We started to fix that by moving out all the SessionFactory and Session handling stuff out into a Rule. Leaving us [...]]]></description>
			<content:encoded><![CDATA[<p>In the <a href="/2011/03/13/testing-databases-with-junit-and-hibernate-part-1-one-to-rule-them/">first part of this little series</a> I showed a simple test based on a simple data model. As we saw the code for the test wasn&#8217;t simple at all, but quite ugly. We started to fix that by moving out all the <tt>SessionFactory</tt> and <tt>Session</tt> handling stuff out into a <a href="/2009/10/04/junit-rules/">Rule</a>. Leaving us with test code like this:</p>
<div class="geshi no java">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">class</span> SuperHeroRepository3Test <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;@Rule</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> <span class="kw2">final</span> SessionFactoryRule sf = <span class="kw2">new</span> SessionFactoryRule<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;@Test</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> <span class="kw4">void</span> returnsHerosWithMatchingType<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; Session session = sf.<span class="me1">getSession</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; SuperPowerType powerType = createSuperPowerType<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; session.<span class="me1">save</span><span class="br0">&#40;</span>powerType<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; SuperPower superpower = createSuperPower<span class="br0">&#40;</span>powerType<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; session.<span class="me1">save</span><span class="br0">&#40;</span>superpower<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; SuperHero hero = createSuperHero<span class="br0">&#40;</span>superpower<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; session.<span class="me1">save</span><span class="br0">&#40;</span>hero<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; sf.<span class="me1">commit</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; SuperHeroRepository heroRepository = <span class="kw2">new</span> SuperHeroRepository<span class="br0">&#40;</span>session<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; List<span class="sy0">&lt;</span>SuperHero<span class="sy0">&gt;</span> heroes = heroRepository.<span class="me1">loadBy</span><span class="br0">&#40;</span>superpower<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; assertNotNull<span class="br0">&#40;</span>heroes<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; assertEquals<span class="br0">&#40;</span><span class="nu0">1</span>, heroes.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> SuperHero createSuperHero<span class="br0">&#40;</span>SuperPower superpower<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; SuperHero hero = <span class="kw2">new</span> SuperHero<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; hero.<span class="me1">name</span> = <span class="st0">&quot;Name&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; hero.<span class="me1">power</span> = superpower<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; hero.<span class="me1">weakness</span> = <span class="st0">&quot;None&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; hero.<span class="me1">secretIdentity</span> = <span class="st0">&quot;Mr. Jones&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">return</span> hero<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> SuperPower createSuperPower<span class="br0">&#40;</span>SuperPowerType powerType<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; SuperPower superpower = <span class="kw2">new</span> SuperPower<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; superpower.<span class="me1">name</span> = <span class="st0">&quot;SuperPower&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; superpower.<span class="me1">description</span> = <span class="st0">&quot;Description&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; superpower.<span class="me1">type</span> = powerType<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">return</span> superpower<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> SuperPowerType createSuperPowerType<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; SuperPowerType powerType = <span class="kw2">new</span> SuperPowerType<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; powerType.<span class="me1">name</span> = <span class="st0">&quot;TheType&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; powerType.<span class="me1">description</span> = <span class="st0">&quot;12345678901234567890aDescription&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">return</span> powerType<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Since we won&#8217;t be satisfied with a single test we&#8217;ll wan&#8217;t to reuse the createXXX methods. The starting idea for how to do this comes from Martin Fowler. He describes <a href="http://martinfowler.com/bliki/ObjectMother.html">ObjectMothers</a> as objects wich give birth to complex objects needed for testing. This is exactly the information we are in. So the createXXX Methods should go to ObjectMothers. As you can see in the current version of the test, there are two things an ObjectMother must do:</p>
<ul>
<li>create Instances of a class that have all attributes filled in a way that satisfies the constraints present in the database.
</li>
<li>
store them in the hibernate session.
</li>
</ul>
<p>So here is a very simple version of such an ObjectMother:</p>
<div class="geshi no java">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">class</span> SuperPowerTypeMother <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> <span class="kw2">final</span> Session session<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> SuperPowerTypeMother<span class="br0">&#40;</span>Session s<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; session = s<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> SuperPowerType instance<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; SuperPowerType powerType = <span class="kw2">new</span> SuperPowerType<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; powerType.<span class="me1">name</span> = <span class="st0">&quot;TheType&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; powerType.<span class="me1">description</span> = <span class="st0">&quot;12345678901234567890aDescription&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; session.<span class="me1">save</span><span class="br0">&#40;</span>powerType<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">return</span> powerType<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>This gets used by the ObjectMother for SuperPowers:</p>
<div class="geshi no java">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">class</span> SuperPowerMother <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> <span class="kw2">final</span> Session session<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> SuperPowerMother<span class="br0">&#40;</span>Session s<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; session = s<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> SuperPower instance<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; SuperPower superpower = <span class="kw2">new</span> SuperPower<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; superpower.<span class="me1">name</span> = <span class="st0">&quot;SuperPower&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; superpower.<span class="me1">description</span> = <span class="st0">&quot;Description&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; superpower.<span class="me1">type</span> = <span class="kw2">new</span> SuperPowerTypeMother<span class="br0">&#40;</span>session<span class="br0">&#41;</span>.<span class="me1">instance</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; session.<span class="me1">save</span><span class="br0">&#40;</span>superpower<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">return</span> superpower<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Finally add a similar SuperHeroMother and our test looks like this:</p>
<div class="geshi no java">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">class</span> SuperHeroRepository4Test <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;@Rule</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> <span class="kw2">final</span> SessionFactoryRule sf = <span class="kw2">new</span> SessionFactoryRule<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;@Test</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> <span class="kw4">void</span> returnsHerosWithMatchingType<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; SuperHero hero = <span class="kw2">new</span> SuperHeroMother<span class="br0">&#40;</span>sf.<span class="me1">getSession</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>.<span class="me1">instance</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; sf.<span class="me1">commit</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; SuperHeroRepository heroRepository = <span class="kw2">new</span> SuperHeroRepository<span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; sf.<span class="me1">getSession</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; List<span class="sy0">&lt;</span>SuperHero<span class="sy0">&gt;</span> heroes = heroRepository.<span class="me1">loadBy</span><span class="br0">&#40;</span>hero.<span class="me1">power</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; assertNotNull<span class="br0">&#40;</span>heroes<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; assertEquals<span class="br0">&#40;</span><span class="nu0">1</span>, heroes.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>This is nice. Short and concentrated on what we want to test. Only the session hints at the presence of the database. Also when our entities get new attributes we have a single place to set a default value for that attribute for all our tests. All thats left in the test for creating a SuperHero is a one liner like this:</p>
<div class="geshi no java">
<ol>
<li class="li1">
<div class="de1">SuperHero hero = <span class="kw2">new</span> SuperHeroMother<span class="br0">&#40;</span>sf.<span class="me1">getSession</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>.<span class="me1">instance</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>So are we done? No, because the ObjectMothers have two serious problems:</p>
<ul>
<li>they create new entities every time, which will result in unique constraint violations once you deal with more then one SuperHero
</li>
<li>
they set the attributes in the same way every time, but sooner or later you want a hero with a special SuperPower, so we want to specify some attributes we are interested in without worrying about the others.
</li>
</ul>
<p>In order to solve the first problem mothers must look in the database if an instance as the one requested is already present. For this the alternate key of the entity is used, and only if a select with this alternate key doesn&#8217;t return an entity a new one is created. Note that since each entity gets stored in the session before it leaves the mother each such lookup select causes a flush of the session and therefore sees previously created entities.</p>
<p>In order to set attributes of the entities a builder pattern is used. The mothers have a method named after the attribute, taking an attribute value, and returning the mother instance. </p>
<p>So the SuperHeroObjectMother now looks like this.</p>
<div class="geshi no java">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">class</span> SuperHeroMother <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> <span class="kw2">final</span> Session session<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> <span class="kw3">String</span> secretIdentity = <span class="st0">&quot;Mr. Jones&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> <span class="kw3">String</span> name = <span class="st0">&quot;Name&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> <span class="kw3">String</span> weakness = <span class="st0">&quot;None&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> SuperPower power = <span class="kw2">null</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> SuperHeroMother<span class="br0">&#40;</span>Session s<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; session = s<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; power = <span class="kw2">new</span> SuperPowerMother<span class="br0">&#40;</span>session<span class="br0">&#41;</span>.<span class="me1">instance</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> SuperHero instance<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; SuperHero hero = loadInstance<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>hero == <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;hero = createInstance<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; hero.<span class="me1">power</span> = power<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; hero.<span class="me1">weakness</span> = weakness<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; hero.<span class="me1">secretIdentity</span> = secretIdentity<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; session.<span class="me1">save</span><span class="br0">&#40;</span>hero<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">return</span> hero<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> SuperHero loadInstance<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">return</span> <span class="br0">&#40;</span>SuperHero<span class="br0">&#41;</span> session.<span class="me1">createCriteria</span><span class="br0">&#40;</span>SuperHero.<span class="kw2">class</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; .<span class="me1">add</span><span class="br0">&#40;</span>Restrictions.<span class="me1">eq</span><span class="br0">&#40;</span><span class="st0">&quot;name&quot;</span>, name<span class="br0">&#41;</span><span class="br0">&#41;</span>.<span class="me1">uniqueResult</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> SuperHero createInstance<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; SuperHero hero = <span class="kw2">new</span> SuperHero<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; hero.<span class="me1">name</span> = name<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">return</span> hero<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> SuperHeroMother name<span class="br0">&#40;</span><span class="kw3">String</span> aName<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; name = aName<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">return</span> <span class="kw2">this</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> SuperHeroMother secretIdentity<span class="br0">&#40;</span><span class="kw3">String</span> aSecretIdentity<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; secretIdentity = aSecretIdentity<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">return</span> <span class="kw2">this</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> SuperHeroMother power<span class="br0">&#40;</span>SuperPower aPower<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; power = aPower<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">return</span> <span class="kw2">this</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> SuperHeroMother weaknes<span class="br0">&#40;</span><span class="kw3">String</span> aWeakness<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; weakness = aWeakness<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">return</span> <span class="kw2">this</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Using such an object mother is extremely easy: create a mother instance, set the attributes you are interested in and call instance().</p>
<p>But writing a Mother is a little tedious and if done as shown above involves a lot of code duplication. So in the next part of the series we&#8217;ll do some refactoring in order to remove at least some of the code duplication.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.schauderhaft.de/2011/03/20/testing-databases-with-junit-and-hibernate-part-2-the-mother-of-all-things/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Testing Databases with JUnit and Hibernate Part 1: One to Rule them</title>
		<link>http://blog.schauderhaft.de/2011/03/13/testing-databases-with-junit-and-hibernate-part-1-one-to-rule-them/</link>
		<comments>http://blog.schauderhaft.de/2011/03/13/testing-databases-with-junit-and-hibernate-part-1-one-to-rule-them/#comments</comments>
		<pubDate>Sun, 13 Mar 2011 21:01:25 +0000</pubDate>
		<dc:creator>Jens Schauder</dc:creator>
				<category><![CDATA[Softwaredevelopment]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[junit]]></category>
		<category><![CDATA[Rule]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://blog.schauderhaft.de/?p=730</guid>
		<description><![CDATA[Databases are an extremely important part of almost every enterprise application. Yet there is very little support for testing your database, which results in very little tests coverage of database related code out in the wild. In a desperate attempt to change that at least a little the article series starting with this article will [...]]]></description>
			<content:encoded><![CDATA[<p>Databases are an extremely important part of almost every enterprise application. Yet there is very little support for testing your database, which results in very little tests coverage of database related code out in the wild. In a desperate attempt to change that at least a little the article series starting with this article will describe some of the problems and possible partial solutions based on Hibernate and JUnit.<br />
As an example I use the following little set of Hibernate entity classes and the database schema Hibernate will create from it:</p>
<div class="geshi no java">
<ol>
<li class="li1">
<div class="de1">@<span class="kw3">Entity</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">class</span> SuperHero <span class="kw2">extends</span> AbstractEntity <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;@<span class="kw3">NotEmpty</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;@Column<span class="br0">&#40;</span>unique = <span class="kw2">true</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> <span class="kw3">String</span> name<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;@ManyToOne</div>
</li>
<li class="li1">
<div class="de1">&nbsp;@NotNull</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> SuperPower power<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;@<span class="kw3">NotEmpty</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> <span class="kw3">String</span> weakness<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;@<span class="kw3">NotEmpty</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> <span class="kw3">String</span> secretIdentity<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<div class="geshi no java">
<ol>
<li class="li1">
<div class="de1">@<span class="kw3">Entity</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">class</span> SuperPower <span class="kw2">extends</span> AbstractEntity <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;@<span class="kw3">NotEmpty</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;@Column<span class="br0">&#40;</span>unique = <span class="kw2">true</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> <span class="kw3">String</span> name<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;@<span class="kw3">NotEmpty</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> <span class="kw3">String</span> description<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;@NotNull</div>
</li>
<li class="li1">
<div class="de1">&nbsp;@ManyToOne</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> SuperPowerType type<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<div class="geshi no java">
<ol>
<li class="li1">
<div class="de1">@<span class="kw3">Entity</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">class</span> SuperPowerType <span class="kw2">extends</span> AbstractEntity <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;@<span class="kw3">NotEmpty</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;@Column<span class="br0">&#40;</span>unique = <span class="kw2">true</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> <span class="kw3">String</span> name<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;@NotNull</div>
</li>
<li class="li1">
<div class="de1">&nbsp;@Length<span class="br0">&#40;</span>min = <span class="nu0">30</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> <span class="kw3">String</span> description<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>As you can see (and if you don&#8217;t I tell you) a SuperHero references a SuperPower and a SuperPower references a SuperPowerType. All have some mandatory attributes.<br />
All three entities have a common supertype providing id and version.</p>
<div class="geshi no java">
<ol>
<li class="li1">
<div class="de1">@MappedSuperclass</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">class</span> AbstractEntity <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;@SuppressWarnings<span class="br0">&#40;</span><span class="st0">&quot;unused&quot;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;@Id</div>
</li>
<li class="li1">
<div class="de1">&nbsp;@GeneratedValue</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> <span class="kw3">Long</span> id<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;@SuppressWarnings<span class="br0">&#40;</span><span class="st0">&quot;unused&quot;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;@Version</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> <span class="kw3">Long</span> version<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>For brevity I skipped on getters and setters.</p>
<p>Finally there is a <tt>SuperHeroRepository</tt> which I want to test. It has a single method returning a <tt>SuperHero</tt> based on the a <tt>SuperPower</tt><br />
A simple test for the SuperHeroRepository might work like this:</p>
<p>Create a <tt>SuperHero</tt> and make sure I can retrieve it again using the <tt>SuperHeroRepository</tt>.</p>
<p>Easy, isn&#8217;t it? Well &#8230; lets see what you really have to do</p>
<ul>
<li> create an empty database</li>
<li> create a <tt>SuperPowerType</tt>, making sure you have all the mandatory fields filled</li>
<li> create a <tt>SuperPower</tt> of that type, making sure you have all the mandatory fields filled</li>
<li> create a <tt>SuperHero</tt>, making sure you have all the mandatory fields filled</li>
<li> use the repository to retrieve <tt>SuperHero</tt>s</li>
<li> assert you got the expected result.</li>
</ul>
<p>So we have to fill all the mandatory fields and provide a SuperPowerType (again with all the mandatory fields) although nothing in the test is concerned with SuperPowerTypes. If you still don&#8217;t believe this results in ugly code have a look at this naive implementation.</p>
<div class="geshi no java">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">class</span> SuperHeroRepository1Test <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> SessionFactory sessionFactory<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> Session session = <span class="kw2">null</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;@Before</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> <span class="kw4">void</span> before<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="co1">// setup the session factory</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; AnnotationConfiguration configuration = <span class="kw2">new</span> AnnotationConfiguration<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; configuration.<span class="me1">addAnnotatedClass</span><span class="br0">&#40;</span>SuperHero.<span class="kw2">class</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; .<span class="me1">addAnnotatedClass</span><span class="br0">&#40;</span>SuperPower.<span class="kw2">class</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; .<span class="me1">addAnnotatedClass</span><span class="br0">&#40;</span>SuperPowerType.<span class="kw2">class</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; configuration.<span class="me1">setProperty</span><span class="br0">&#40;</span><span class="st0">&quot;hibernate.dialect&quot;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="st0">&quot;org.hibernate.dialect.H2Dialect&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; configuration.<span class="me1">setProperty</span><span class="br0">&#40;</span><span class="st0">&quot;hibernate.connection.driver_class&quot;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="st0">&quot;org.h2.Driver&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; configuration.<span class="me1">setProperty</span><span class="br0">&#40;</span><span class="st0">&quot;hibernate.connection.url&quot;</span>, <span class="st0">&quot;jdbc:h2:mem&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; configuration.<span class="me1">setProperty</span><span class="br0">&#40;</span><span class="st0">&quot;hibernate.hbm2ddl.auto&quot;</span>, <span class="st0">&quot;create&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; sessionFactory = configuration.<span class="me1">buildSessionFactory</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; session = sessionFactory.<span class="me1">openSession</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;@Test</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> <span class="kw4">void</span> returnsHerosWithMatchingType<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="co1">// create the objects needed for testing</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; SuperPowerType powerType = <span class="kw2">new</span> SuperPowerType<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; powerType.<span class="me1">name</span> = <span class="st0">&quot;TheType&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; powerType.<span class="me1">description</span> = <span class="st0">&quot;12345678901234567890aDescription&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; SuperPower superpower = <span class="kw2">new</span> SuperPower<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; superpower.<span class="me1">name</span> = <span class="st0">&quot;SuperPower&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; superpower.<span class="me1">description</span> = <span class="st0">&quot;Description&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; superpower.<span class="me1">type</span> = powerType<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; SuperHero hero = <span class="kw2">new</span> SuperHero<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; hero.<span class="me1">name</span> = <span class="st0">&quot;Name&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; hero.<span class="me1">power</span> = superpower<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; hero.<span class="me1">weakness</span> = <span class="st0">&quot;None&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; hero.<span class="me1">secretIdentity</span> = <span class="st0">&quot;Mr. Jones&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="co1">// storing the objects for the test in the database</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; session.<span class="me1">save</span><span class="br0">&#40;</span>powerType<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; session.<span class="me1">save</span><span class="br0">&#40;</span>superpower<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; session.<span class="me1">save</span><span class="br0">&#40;</span>hero<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; SuperHeroRepository heroRepository = <span class="kw2">new</span> SuperHeroRepository<span class="br0">&#40;</span>session<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; List<span class="sy0">&lt;</span>SuperHero<span class="sy0">&gt;</span> heroes = heroRepository.<span class="me1">loadBy</span><span class="br0">&#40;</span>superpower<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; assertNotNull<span class="br0">&#40;</span>heroes<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; assertEquals<span class="br0">&#40;</span><span class="nu0">1</span>, heroes.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;@After</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> <span class="kw4">void</span> after<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; session.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; sessionFactory.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>There is really only one positive thing I can say about this test: it uses H2 in In-Memory mode so it is reasonable fast. There is the first lesson: *Use an in memory database for testing if possible. It&#8217;s easily 100*faster then a disc based database*</p>
<p>So obviously we want to refactor this monster, which might after some method extracting result into something like this:</p>
<div class="geshi no java">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">class</span> SuperHeroRepository2Test <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> SessionFactory sessionFactory<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> Session session<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;@Before</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> <span class="kw4">void</span> before<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; sessionFactory = createSessionFactory<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; session = sessionFactory.<span class="me1">openSession</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; Transaction transaction = session.<span class="me1">beginTransaction</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;@Test</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> <span class="kw4">void</span> returnsHerosWithMatchingType<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; SuperPowerType powerType = createSuperPowerType<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; session.<span class="me1">save</span><span class="br0">&#40;</span>powerType<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; SuperPower superpower = createSuperPower<span class="br0">&#40;</span>powerType<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; session.<span class="me1">save</span><span class="br0">&#40;</span>superpower<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; SuperHero hero = createSuperHero<span class="br0">&#40;</span>superpower<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; session.<span class="me1">save</span><span class="br0">&#40;</span>hero<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; SuperHeroRepository heroRepository = <span class="kw2">new</span> SuperHeroRepository<span class="br0">&#40;</span>session<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; List<span class="sy0">&lt;</span>SuperHero<span class="sy0">&gt;</span> heroes = heroRepository.<span class="me1">loadBy</span><span class="br0">&#40;</span>superpower<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; assertNotNull<span class="br0">&#40;</span>heroes<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; assertEquals<span class="br0">&#40;</span><span class="nu0">1</span>, heroes.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> SessionFactory createSessionFactory<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; AnnotationConfiguration configuration = <span class="kw2">new</span> AnnotationConfiguration<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; configuration.<span class="me1">addAnnotatedClass</span><span class="br0">&#40;</span>SuperHero.<span class="kw2">class</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; .<span class="me1">addAnnotatedClass</span><span class="br0">&#40;</span>SuperPower.<span class="kw2">class</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; .<span class="me1">addAnnotatedClass</span><span class="br0">&#40;</span>SuperPowerType.<span class="kw2">class</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; configuration.<span class="me1">setProperty</span><span class="br0">&#40;</span><span class="st0">&quot;hibernate.dialect&quot;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="st0">&quot;org.hibernate.dialect.H2Dialect&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; configuration.<span class="me1">setProperty</span><span class="br0">&#40;</span><span class="st0">&quot;hibernate.connection.driver_class&quot;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="st0">&quot;org.h2.Driver&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; configuration.<span class="me1">setProperty</span><span class="br0">&#40;</span><span class="st0">&quot;hibernate.connection.url&quot;</span>, <span class="st0">&quot;jdbc:h2:mem&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; configuration.<span class="me1">setProperty</span><span class="br0">&#40;</span><span class="st0">&quot;hibernate.hbm2ddl.auto&quot;</span>, <span class="st0">&quot;create&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; SessionFactory sessionFactory = configuration.<span class="me1">buildSessionFactory</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">return</span> sessionFactory<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> SuperHero createSuperHero<span class="br0">&#40;</span>SuperPower superpower<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; SuperHero hero = <span class="kw2">new</span> SuperHero<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; hero.<span class="me1">name</span> = <span class="st0">&quot;Name&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; hero.<span class="me1">power</span> = superpower<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; hero.<span class="me1">weakness</span> = <span class="st0">&quot;None&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; hero.<span class="me1">secretIdentity</span> = <span class="st0">&quot;Mr. Jones&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">return</span> hero<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> SuperPower createSuperPower<span class="br0">&#40;</span>SuperPowerType powerType<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; SuperPower superpower = <span class="kw2">new</span> SuperPower<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; superpower.<span class="me1">name</span> = <span class="st0">&quot;SuperPower&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; superpower.<span class="me1">description</span> = <span class="st0">&quot;Description&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; superpower.<span class="me1">type</span> = powerType<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">return</span> superpower<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> SuperPowerType createSuperPowerType<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; SuperPowerType powerType = <span class="kw2">new</span> SuperPowerType<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; powerType.<span class="me1">name</span> = <span class="st0">&quot;TheType&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; powerType.<span class="me1">description</span> = <span class="st0">&quot;12345678901234567890aDescription&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">return</span> powerType<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>This would be ok, if this would be the only test of this kind. But other similar test need the SessionFactory as well so I will move all the SessionFactory, Session and Transaction stuff into a <a href="/2009/10/04/junit-rules/">Rule</a> </p>
<div class="geshi no java">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">class</span> SessionFactoryRule <span class="kw2">implements</span> MethodRule <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> SessionFactory sessionFactory<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> Transaction transaction<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> Session session<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;@Override</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> <span class="kw3">Statement</span> apply<span class="br0">&#40;</span><span class="kw2">final</span> <span class="kw3">Statement</span> statement, FrameworkMethod method,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw3">Object</span> test<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">return</span> <span class="kw2">new</span> <span class="kw3">Statement</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;@Override</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw2">public</span> <span class="kw4">void</span> evaluate<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw2">throws</span> <span class="kw3">Throwable</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; sessionFactory = createSessionFactory<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; createSession<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; beginTransaction<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">try</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;statement.<span class="me1">evaluate</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw2">finally</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;shutdown<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> <span class="kw4">void</span> shutdown<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">try</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw2">try</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">try</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;transaction.<span class="me1">rollback</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span><span class="kw3">Exception</span> ex<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;ex.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; session.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span><span class="kw3">Exception</span> ex<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; ex.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;sessionFactory.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span><span class="kw3">Exception</span> ex<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;ex.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> SessionFactory createSessionFactory<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; AnnotationConfiguration configuration = <span class="kw2">new</span> AnnotationConfiguration<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; configuration.<span class="me1">addAnnotatedClass</span><span class="br0">&#40;</span>SuperHero.<span class="kw2">class</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; .<span class="me1">addAnnotatedClass</span><span class="br0">&#40;</span>SuperPower.<span class="kw2">class</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; .<span class="me1">addAnnotatedClass</span><span class="br0">&#40;</span>SuperPowerType.<span class="kw2">class</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; configuration.<span class="me1">setProperty</span><span class="br0">&#40;</span><span class="st0">&quot;hibernate.dialect&quot;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="st0">&quot;org.hibernate.dialect.H2Dialect&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; configuration.<span class="me1">setProperty</span><span class="br0">&#40;</span><span class="st0">&quot;hibernate.connection.driver_class&quot;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="st0">&quot;org.h2.Driver&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; configuration.<span class="me1">setProperty</span><span class="br0">&#40;</span><span class="st0">&quot;hibernate.connection.url&quot;</span>, <span class="st0">&quot;jdbc:h2:mem&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; configuration.<span class="me1">setProperty</span><span class="br0">&#40;</span><span class="st0">&quot;hibernate.hbm2ddl.auto&quot;</span>, <span class="st0">&quot;create&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; SessionFactory sessionFactory = configuration.<span class="me1">buildSessionFactory</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">return</span> sessionFactory<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> Session createSession<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; session = sessionFactory.<span class="me1">openSession</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">return</span> session<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> <span class="kw4">void</span> commit<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; transaction.<span class="me1">commit</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> <span class="kw4">void</span> beginTransaction<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; transaction = session.<span class="me1">beginTransaction</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> Session getSession<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">return</span> session<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Which leaves the test in a somewhat acceptable state.</p>
<div class="geshi no java">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">class</span> SuperHeroRepository3Test <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;@Rule</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> <span class="kw2">final</span> SessionFactoryRule sf = <span class="kw2">new</span> SessionFactoryRule<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;@Test</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> <span class="kw4">void</span> returnsHerosWithMatchingType<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; Session session = sf.<span class="me1">getSession</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; SuperPowerType powerType = createSuperPowerType<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; session.<span class="me1">save</span><span class="br0">&#40;</span>powerType<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; SuperPower superpower = createSuperPower<span class="br0">&#40;</span>powerType<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; session.<span class="me1">save</span><span class="br0">&#40;</span>superpower<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; SuperHero hero = createSuperHero<span class="br0">&#40;</span>superpower<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; session.<span class="me1">save</span><span class="br0">&#40;</span>hero<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; sf.<span class="me1">commit</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; SuperHeroRepository heroRepository = <span class="kw2">new</span> SuperHeroRepository<span class="br0">&#40;</span>session<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; List<span class="sy0">&lt;</span>SuperHero<span class="sy0">&gt;</span> heroes = heroRepository.<span class="me1">loadBy</span><span class="br0">&#40;</span>superpower<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; assertNotNull<span class="br0">&#40;</span>heroes<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; assertEquals<span class="br0">&#40;</span><span class="nu0">1</span>, heroes.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// &#8230; private methods more or less as before</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>All the <tt>SessionFactory</tt> creation is now moved out into a Rule and is therefore perfectly reusable. You now can change the way you create your <tt>SessionFactory</tt> at a single point for all tests in need of a database. This is nice and it shall be enough for today. Next week we&#8217;ll take care of our <tt>SuperHero</tt> and her dependencies.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.schauderhaft.de/2011/03/13/testing-databases-with-junit-and-hibernate-part-1-one-to-rule-them/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>An Analysis of NonUniqueObjectException and LazyInitializationException in Hibernate</title>
		<link>http://blog.schauderhaft.de/2010/07/11/an-analysis-of-nonuniqueobjectexception-and-lazyinitializationexception-in-hibernate/</link>
		<comments>http://blog.schauderhaft.de/2010/07/11/an-analysis-of-nonuniqueobjectexception-and-lazyinitializationexception-in-hibernate/#comments</comments>
		<pubDate>Sun, 11 Jul 2010 19:25:19 +0000</pubDate>
		<dc:creator>Jens Schauder</dc:creator>
				<category><![CDATA[Softwaredevelopment]]></category>
		<category><![CDATA[domain driven design]]></category>
		<category><![CDATA[hibernate]]></category>

		<guid isPermaLink="false">http://blog.schauderhaft.de/?p=529</guid>
		<description><![CDATA[I consider Hibernate a great and useful tool. But it has some mean Exceptions lurking in the darker corners. Today I&#8217;d like to explore the ones from the title in a little more detail, including different approaches on how to avoid them. Let&#8217;s start with the well known LazyInitializationException. When you search for this one [...]]]></description>
			<content:encoded><![CDATA[<p>I consider Hibernate a great and useful tool. But it has some mean Exceptions lurking in the darker corners. Today I&#8217;d like to explore the ones from the title in a little more detail, including different approaches on how to avoid them.</p>
<p>Let&#8217;s start with the well known <tt>LazyInitializationException</tt>. When you search for this one in the Internet you end up with scenarios like this one:</p>
<p>You load <tt>A</tt>, close the session you  used and try to access a property of <tt>A</tt> which gets loaded lazily resulting in a <tt>LazyInitializationException</tt>. That one is well described, including strategies to avoid it, which basically consist of not closing the session to early.</p>
<p>But there are more hideous scenarios. Assume the classes Mom, Dad and Kid are mapped as one would expect, with references from Mom and Dad to Kid. Now consider the following piece of code:</p>
<div class="geshi no java">
<ol>
<li class="li1">
<div class="de1">Session session = openSession<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">session.<span class="me1">beginTransaction</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">Mom mom = <span class="br0">&#40;</span>Mom<span class="br0">&#41;</span> session.<span class="me1">load</span><span class="br0">&#40;</span>Mom.<span class="kw2">class</span>, momId<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">Kid momsKid = mom.<span class="me1">getKid</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// dad comes by</span></div>
</li>
<li class="li1">
<div class="de1">Dad dad = <span class="br0">&#40;</span>Dad<span class="br0">&#41;</span> session.<span class="me1">load</span><span class="br0">&#40;</span>Dad.<span class="kw2">class</span>, dadId<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">Kid dadsKid = dad.<span class="me1">getKid</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// and leaves</span></div>
</li>
<li class="li1">
<div class="de1">session.<span class="me1">evict</span><span class="br0">&#40;</span>dad<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// alas he has taken kido with him</span></div>
</li>
<li class="li1">
<div class="de1">momsKid.<span class="me1">getName</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>Depending on your exact Mapping you might get a <tt>LazyInitializationException</tt> in the last line, although the session is still open. The problem here is that when dad got evicted the kid got evicted as well. And since Mom has a reference to the exact same object, that object isn&#8217;t attached to any session anymore. In order to see this effect you&#8217;ll have to use mappings like this:</p>
<div class="geshi no java">
<div class="head">@ManyToOne(fetch = LAZY, cascade = CascadeType.ALL)</div>
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; @Cascade<span class="br0">&#40;</span>org.<span class="me1">hibernate</span>.<span class="me1">annotations</span>.<span class="me1">CascadeType</span>.<span class="me1">ALL</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">private</span> Kid kid<span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>The <tt>NonUniqueObjectException</tt> gets caused by what could be considered the reverse process. Examine the following piece of code:</p>
<div class="geshi no java">
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Dad left for another woman, I mean Session</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; Dad dad = loadDad<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; Session session = openSession<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; session.<span class="me1">beginTransaction</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; Mom mom = <span class="br0">&#40;</span>Mom<span class="br0">&#41;</span> session.<span class="me1">load</span><span class="br0">&#40;</span>Mom.<span class="kw2">class</span>, momId<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">System</span>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span>mom.<span class="me1">getKid</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getName</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Now dad wants to move back in</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; session.<span class="me1">saveOrUpdate</span><span class="br0">&#40;</span>dad<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>The first method call loads a <tt>Dad</tt> object including <tt>Kid</tt> from a different session. Then from the &#8216;main&#8217; session <tt>Mom</tt> gets loaded including kid. When we attach the <tt>Dad</tt> object to the session it tries to attach its version of the <tt>Kid</tt> as well, which collides with the <tt>Kid</tt> already present in the session.</p>
<p>So how can we avoid these kind of problem? I see several options:</p>
<ul>
<li>Don&#8217;t use Cascade. Of course this means much more effort on your side in many cases, since you have to carefully track what you need to attach or evict from a session.</li>
<li>Don&#8217;t use <tt>evict</tt> and don&#8217;t reattach existing instances to sessions. I guess this should work in many cases. But I have seen cases where this approach would have caused a large overhead, because reloading complex object graphs.</li>
<li>Carefully design your cascading boundaries. A look at the Aggregate Root from <a href="http://www.amazon.de/gp/product/0321125215?ie=UTF8&#038;tag=schauderhafte-21&#038;linkCode=as2&#038;camp=1638&#038;creative=19454&#038;creativeASIN=0321125215">DDD</a> might help here. An Aggregate Root is a single class which works as a gate keeper (did anybody say facade) to a cluster of classes related to the Aggregate Root. When all the Hibernate related actions go against that Aggregate Root, and cascade from there to the content and only the content of the Aggregate Root you should be safe. All entities outside an Aggregate Root have to use the Aggregate Root or Repositories to gain access. This needs some bookkeeping. But when you do it properly it might actually improve the over all design of your code. Please note that all this is a thought experiment on my side, and I can&#8217;t promise that it actually works as intended, but I think it should.</li>
</ul>
<p>If you want the complete source code for the example, you can download this <a href="/wp-content/uploads/2010/07/sources.zip">source.zip</a> file.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.schauderhaft.de/2010/07/11/an-analysis-of-nonuniqueobjectexception-and-lazyinitializationexception-in-hibernate/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hibernate has Problems, but where is the Alternative?</title>
		<link>http://blog.schauderhaft.de/2009/10/18/hibernate-problems-alternative/</link>
		<comments>http://blog.schauderhaft.de/2009/10/18/hibernate-problems-alternative/#comments</comments>
		<pubDate>Sun, 18 Oct 2009 17:30:55 +0000</pubDate>
		<dc:creator>Jens Schauder</dc:creator>
				<category><![CDATA[Softwaredevelopment]]></category>
		<category><![CDATA[future]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[orm]]></category>

		<guid isPermaLink="false">http://blog.schauderhaft.de/?p=294</guid>
		<description><![CDATA[In a late blog post Stephan Schmidt vents his problems with hibernate and declares &#8220;ORMs are a thing of the past&#8221; I agree to some extend: - The SQL generated by Hibernate by default is horrible. Huge joins, with hundreds of columns, many unneeded. - Annotations feel like dirt in your code, and maintaining XML [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_296" class="wp-caption alignleft" style="width: 310px"><img class="size-medium wp-image-296" title="875413_47541979" src="http://blog.schauderhaft.de/wp-content/uploads/2009/10/875413_47541979-300x203.jpg" alt="875413_47541979" width="300" height="203" /><p class="wp-caption-text">Scale</p></div>
<p>In a late blog post Stephan Schmidt vents his problems with hibernate and declares &#8220;<a href="http://codemonkeyism.com/orms/">ORMs are a thing of the past</a>&#8221;</p>
<p>I agree to some extend:<br />
- The SQL generated by Hibernate by default is horrible. Huge joins, with hundreds of columns, many unneeded.<br />
- Annotations feel like dirt in your code, and maintaining XML mappings is just painful.<br />
- LazyInitializationExceptions are a pain in the <span style="text-decoration: line-through;">a..</span> neck.</p>
<p>But does that justify the conclusion, that ORMs will go away in the near future? I don&#8217;t think so. Of course my <a href="http://blog.schauderhaft.de/2009/09/20/your-perspective-is-biased/">perspective is biased</a>, but in the applications I build I deal typically with 200-500 tables. Just typing the basic CRUD Statement, and wrapping them into usable objects is a pain, and a lot of work, which I gladly will hand over to an ORM.</p>
<p>Tracking changes in objects is another task, I gladly handover to an ORM.</p>
<p>Even writing annotations, while being far from perfect is better then most alternatives I know.</p>
<p>Implementing my own caching logic? No thanx. The ORM can do that pretty well.</p>
<p>I think the crucial point lies in Stephans last paragraph, where he sketches some ideas for alternatives. ORMs aren&#8217;t bad in themselves. They are just difficult to get right. Hibernate did a great job. It is the first one to get wide spread usage. And most points mentioned above are a weakness in Hibernate (or JPA) or possibly Java. So my claim is: ORMs aren&#8217;t dead, they aren&#8217;t even grown up.</p>
<p>So what properties might a grown up ORM have?</p>
<ul>
<li>Usage of persistence independent annotations: The problem with annotations is: they don&#8217;t belong in the business domain, where your classes live. They are part of the persistence layer, and should stay there. But when you look at the JPA annotations you&#8217;ll find a lot that is pretty usefull in GUI context as well. For example the length of a field isn&#8217;t only important for the database but for the GUI as well. Same for validations. So I&#8217;d think, in a couple years from now we&#8217;ll have annotations (or other language features), that let us specify features of properties and references, which truely live in the domain world. And the ORMs will just utilize that information for 90% of their needs</li>
<li>When the references will have more information attached to them. E.g. if it is just a association, or an aggregation, or if the M in an 1:M relation is &#8216;big&#8217;. And ORMs will use that to optimize there SQL.</li>
<li>The management of Sessions will move toward a declarative style, just as transactions did in the last decade.</li>
<li> RDBMS vendors will finally realize the power of ORMs, and will provide more efficient protocols for the ORMs to communicate with.</li>
<li> ORMs will monitor how they are used for a certain application, and will use that information to improve the SQL used.</li>
</ul>
<p>But as so often, the most important change will be a people change: People will finally let databases drop into the background where they belong, and manage the schema through the ORM. I always wonder &#8220;Why?&#8221; when I hear people describe how the build a database first, and then map classes to the tables. That is the wrong way around: Build a strong domain model first. Let the ORM create a database schema for you from that. And then get someone with strong database knowledge involved to tweak it where necessary. This is when you start seriously gaining something for your struggle with the ORM. Most importantly: you get strong support for database refactorings.</p>
<p>If you want to read more about the whole ORM discussion, you might be interested in this article by <a href="http://debasishg.blogspot.com/2009/10/are-orms-really-thing-of-past.html">Debasish Ghosh</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.schauderhaft.de/2009/10/18/hibernate-problems-alternative/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
	</channel>
</rss>

