<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-487124160501087596</id><updated>2011-12-12T11:57:24.788-07:00</updated><category term='idea'/><category term='reflection'/><category term='tests'/><category term='groovy'/><category term='seam'/><category term='spring'/><category term='security'/><category term='orm'/><category term='annotations'/><category term='maven'/><category term='cloud'/><category term='struts 2'/><category term='conferences'/><title type='text'>Java Journeyman</title><subtitle type='html'>Musings from a Java developer</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.javajourneyman.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/487124160501087596/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://www.javajourneyman.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Andrew Will</name><uri>http://www.blogger.com/profile/05660726425091773836</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='25' src='http://bp3.blogger.com/_2-ZeSFOI_RE/SHVdKUuj15I/AAAAAAAAAEg/foscorvVu5c/S220/n506783965_126918_1801.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>16</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-487124160501087596.post-2962548961640789992</id><published>2011-02-21T11:08:00.015-07:00</published><updated>2011-12-12T11:57:24.799-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cloud'/><title type='text'>Jumping on the Amazon EC2 Cloud</title><content type='html'>I've been meaning to try out Amazon's EC2 cloud for a while. I had been looking at tools that make it easy to deploy Java web applications for the cloud like &lt;a href="http://www.cloudfoundry.com/"&gt;Cloud Foundry&lt;/a&gt; or even Amazon's &lt;a href="http://aws.amazon.com/elasticbeanstalk/"&gt;Elastic Beanstalk&lt;/a&gt;, but I thought I should get more familiar with deploying cloud applications myself before using tools that abstract some of the basics away from you.&lt;br /&gt;&lt;br /&gt;Yesterday I spent an afternoon and was able to configure the following:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Launched a virtual instance of a linux distro.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Installed and configured Apache Tomcat.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Installed a sample web application on Tomcat.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Assigned my instance an IP address.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Mapped a domain to point at the IP address.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Configured SSL.&lt;/li&gt;&lt;/ul&gt;...and presto! I have an application running on my EC2 instance that uses SSL:&lt;br /&gt;&lt;br /&gt;&lt;a href="https://www.doulosdev.com/directory/"&gt;https://www.doulosdev.com/directory/&lt;/a&gt;&lt;br /&gt;(NOTE: Might not be up at this moment as I will be bringing it up-and-down!)&lt;br /&gt;&lt;br /&gt;I still need to hammer out some kinks (e.g. allow regular HTTP traffic, configure the "www" subdomain, etc.), but not too bad for a cloud n00b! :-)&lt;br /&gt;&lt;br /&gt;In summary, take Amazon EC2 out for a spin.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/487124160501087596-2962548961640789992?l=www.javajourneyman.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.javajourneyman.com/feeds/2962548961640789992/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=487124160501087596&amp;postID=2962548961640789992' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/487124160501087596/posts/default/2962548961640789992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/487124160501087596/posts/default/2962548961640789992'/><link rel='alternate' type='text/html' href='http://www.javajourneyman.com/2011/02/jumping-on-amazon-ec2-cloud.html' title='Jumping on the Amazon EC2 Cloud'/><author><name>Andrew Will</name><uri>http://www.blogger.com/profile/05660726425091773836</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='25' src='http://bp3.blogger.com/_2-ZeSFOI_RE/SHVdKUuj15I/AAAAAAAAAEg/foscorvVu5c/S220/n506783965_126918_1801.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-487124160501087596.post-3466001395600265938</id><published>2009-08-10T21:21:00.016-07:00</published><updated>2009-08-11T21:01:08.046-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><title type='text'>VMWare Buys SpringSource?!</title><content type='html'>Wow, where did this one come from?! VMWare? And Spring?&lt;br /&gt;&lt;br /&gt;I'm a big fan of Spring and the major impact they've had on the Java platform and Enterprise development in general. Rod Johnson's &lt;span style="font-weight:bold;"&gt;J2EE Development without EJB&lt;/span&gt; is still a good read five years later and Spring's response to EJB still reverberates today. I had no idea Spring was looking to be acquired. Wow, Oracle buys Java and now VMWare purchases Spring. What else is going to happen in 2009?! &lt;br /&gt;&lt;br /&gt;The &lt;a target="cnetwin" href="http://news.cnet.com/8301-13505_3-10306690-16.html?tag=mncol"&gt;CNET&lt;/a&gt; editorial in the related links is a good read. The author mentions his previous hope that Red Hat would acquire SpringSource, but I don't think that ever was a viable option for Red Hat. Red Hat / JBoss's philosophy is very different from Spring's. Red Hat / JBoss pushes its own web framework (Seam) built on JSF &amp; EJB 3 as well as its JBoss server while Spring pushes its own lightweight server and Spring MVC among other things. Also, a few years back there was that falling out between Spring and Hibernate with the latter later being purchased by JBoss.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Related Links&lt;/span&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;a target="dwin" href="http://java.dzone.com/articles/vmware-acquire-springsource"&gt;Dzone Article&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a target="nwin" href="http://ir.vmware.com/phoenix.zhtml?c=193221&amp;amp;p=irol-newsArticle&amp;amp;ID=1319248&amp;amp;highlight="&gt;News Release&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a target="swin" href="http://blog.springsource.com/2009/08/10/springsource-chapter-two"&gt;Spring's 2 Cents&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a target="cnetwin" href="http://news.cnet.com/8301-13505_3-10306690-16.html?tag=mncol"&gt;CNET Editorial&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/487124160501087596-3466001395600265938?l=www.javajourneyman.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.javajourneyman.com/feeds/3466001395600265938/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=487124160501087596&amp;postID=3466001395600265938' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/487124160501087596/posts/default/3466001395600265938'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/487124160501087596/posts/default/3466001395600265938'/><link rel='alternate' type='text/html' href='http://www.javajourneyman.com/2009/08/vmware-buys-springsource.html' title='VMWare Buys SpringSource?!'/><author><name>Andrew Will</name><uri>http://www.blogger.com/profile/05660726425091773836</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='25' src='http://bp3.blogger.com/_2-ZeSFOI_RE/SHVdKUuj15I/AAAAAAAAAEg/foscorvVu5c/S220/n506783965_126918_1801.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-487124160501087596.post-1863618498888846280</id><published>2009-08-07T17:58:00.011-07:00</published><updated>2009-08-07T18:18:58.807-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><title type='text'>Maven Makes Me Feel Like I Have Attention-Deficit Dis... Oh, Look - a Kitty!</title><content type='html'>This is not a post on Maven-bashing. This is just a post on how Maven keeps me humble. If I ever find myself becoming arrogant or think myself a gifted developer,  browsing a "simple" &lt;span style="font-weight:bold;"&gt;pom.xml&lt;/span&gt; file quickly drives those notions of grandeur away.&lt;br /&gt;&lt;br /&gt;I just can't muster up the motivation to delve more into maven internals. Sometimes I wake up and say, "&lt;span style="font-style:italic;"&gt;Today is the day, I will conquer Maven!&lt;/span&gt;" I'll jump on the web and browse through Maven's documentation, but then somewhere around the word &lt;span style="font-weight:bold;"&gt;archetype&lt;/span&gt;, I'll either fall asleep or get distracted.&lt;br /&gt;&lt;br /&gt;I've used Maven in a work project for about a year now. Of course, I didn't &lt;span style="font-style:italic;"&gt;actually &lt;/span&gt;write the pom file. Like most people I inherited it. I browse it occasionally, but then somewhere around "&lt;span style="font-style:italic;"&gt;plugins&lt;/span&gt;," my head explodes and I start drooling.&lt;br /&gt;&lt;br /&gt;Is it just me, but I found my Ant &lt;span style="font-weight:bold;"&gt;build.xml&lt;/span&gt; file a lot easier to at least &lt;span style="font-style:italic;"&gt;comprehend&lt;/span&gt;. Don't get me wrong - I don't have the knowledge to actually create a build file from scratch. I always started with one that I had done previously and then modified it. Probably the first one I did was just ripped from some online example, which begs the question if somewhere floating out on the Internet is the &lt;a target="eveWindow" href="http://en.wikipedia.org/wiki/Mitochondrial_eve"&gt;Mitochondrial Eve&lt;/a&gt; of &lt;span style="font-weight:bold;"&gt;build.xml&lt;/span&gt; files...?&lt;br /&gt;&lt;br /&gt;I'm not saying that Ant is superior to Maven. I definitely think the two projects are related. Obviously, they are trying to accomplish two different &lt;span style="font-style:italic;"&gt;goals&lt;/span&gt;...or should I say &lt;span style="font-style:italic;"&gt;targets&lt;/span&gt;? Heh, heh. Maven just does &lt;span style="font-style:italic;"&gt;so&lt;/span&gt; much that I get overwhelmed in the details.&lt;br /&gt;&lt;br /&gt;Once again, I'm not saying that Maven is evil - I don't have the knowledge to make that assessment. I'm just saying that for me personally, Maven has quite a steep learning curve! If Ant is the &lt;span style="font-style:italic;"&gt;Matterhorn&lt;/span&gt;, then Maven is &lt;span style="font-style:italic;"&gt;Mount Everest&lt;/span&gt;. That being said, I'll feel a lot better about my accomplishment after conquering Maven than conquering Ant! :-)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;[ DISCLAIMER: This post was made in good fun. The author accepts no blame for possible discussions involving Ant, Maven, or rabid monkeys. ]&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/487124160501087596-1863618498888846280?l=www.javajourneyman.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.javajourneyman.com/feeds/1863618498888846280/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=487124160501087596&amp;postID=1863618498888846280' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/487124160501087596/posts/default/1863618498888846280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/487124160501087596/posts/default/1863618498888846280'/><link rel='alternate' type='text/html' href='http://www.javajourneyman.com/2009/08/maven-makes-me-feel-like-i-have.html' title='Maven Makes Me Feel Like I Have Attention-Deficit Dis... Oh, Look - a Kitty!'/><author><name>Andrew Will</name><uri>http://www.blogger.com/profile/05660726425091773836</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='25' src='http://bp3.blogger.com/_2-ZeSFOI_RE/SHVdKUuj15I/AAAAAAAAAEg/foscorvVu5c/S220/n506783965_126918_1801.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-487124160501087596.post-2146937364671530262</id><published>2009-06-29T21:37:00.003-07:00</published><updated>2009-07-04T17:55:05.781-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Goin' Groovy</title><content type='html'>Over the past month I've been spending a lot of time w/ Groovy and Grails. So far I'm pretty impressed! Groovy really does reduce Java's "signal-to-noise" ratio (i.e. less code for the same functionality) and the fact that Groovy was designed from the ground up to run on the JVM is definitely a plus for me! Also, the fact that Grails builds on Spring MVC and Hibernate (via GORM) helped me get up-and-running quickly.&lt;br /&gt;&lt;br /&gt;A few weeks back I attended a Groovy Code Camp here in Phoenix. One of the speakers said that once you program in Groovy, it'll change the way you think when trying to solve problems. I didn't think too much about that statement, but then the following week he was proved right. Even after only a few weeks of using Groovy I went back to my job working with Java and found times where I was coding and thought things like:&lt;blockquote&gt;"I could write this a lot more cleanly if I had closures!"&lt;/blockquote&gt;&lt;blockquote&gt;"Some named parameters would be nice here!"&lt;/blockquote&gt;&lt;blockquote&gt;"I sure could sure XML Slurper right now!"&lt;/blockquote&gt;&lt;blockquote&gt;"Why do I have to type 'public' so often?"&lt;/blockquote&gt;&lt;blockquote&gt;"Groovy Truth - how I miss thee greatly!"&lt;/blockquote&gt;Anyways, you get the picture. It's funny -- my first impression of Groovy was that it was TOO powerful. For instance, in Groovy we really do not NEED an external AOP framework (a la AspectJ) because that power is built into the language! Now I'm beginning to see that Groovy's "power" frees me from the little things and allows me to write cleaner and more concise code.&lt;br /&gt;&lt;br /&gt;Anywho, those are just my initial impressions after dabbling with Groovy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/487124160501087596-2146937364671530262?l=www.javajourneyman.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.javajourneyman.com/feeds/2146937364671530262/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=487124160501087596&amp;postID=2146937364671530262' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/487124160501087596/posts/default/2146937364671530262'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/487124160501087596/posts/default/2146937364671530262'/><link rel='alternate' type='text/html' href='http://www.javajourneyman.com/2009/06/goin-groovy.html' title='Goin&apos; Groovy'/><author><name>Andrew Will</name><uri>http://www.blogger.com/profile/05660726425091773836</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='25' src='http://bp3.blogger.com/_2-ZeSFOI_RE/SHVdKUuj15I/AAAAAAAAAEg/foscorvVu5c/S220/n506783965_126918_1801.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-487124160501087596.post-8030578613737499466</id><published>2009-04-25T10:57:00.006-07:00</published><updated>2009-06-08T20:19:55.119-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><title type='text'>Spring MVC</title><content type='html'>For my first independent study, I've decided to explore Groovy + Grails. When looking into Grails, I found that much of the web-related functionality is built on Spring MVC. While my primary web framework has been WebWork/Struts 2 over the past couple of years, I thought it might benefit me to look more into Spring MVC as Grails is built on top of it. Also, Spring MVC has been around for a while and seems to have a healthy community behind it.&lt;br /&gt;&lt;br /&gt;While reading through their documentation, I found the following interesting statement from Spring's online documentation:&lt;blockquote&gt;&lt;br /&gt;Compared to WebWork, &lt;span style="font-weight:bold;"&gt;Spring has more differentiated object roles&lt;/span&gt;. It supports the notion of a Controller, an optional command or form object, and a model that gets passed to the view. The model will normally include the command or form object but also arbitrary reference data; instead, a WebWork Action combines all those roles into one single object. WebWork does allow you to use existing business objects as part of your form, but only by making them bean properties of the respective Action class. Finally, the same Action instance that handles the request is used for evaluation and form population in the view. Thus, reference data needs to be modeled as bean properties of the Action too. These are (arguably) &lt;span style="font-weight:bold;"&gt;too many roles for one object&lt;/span&gt;.&lt;br /&gt;&lt;/blockquote&gt;It always interesting to hear the different philosophies and ideas that went into the development of a web framework and hear how their developers feel about other similar frameworks.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Related Links&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a target="groovywin" href="http://static.springframework.org/spring/docs/2.5.x/reference/mvc.html"&gt;Spring MVC Documentation&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/487124160501087596-8030578613737499466?l=www.javajourneyman.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.javajourneyman.com/feeds/8030578613737499466/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=487124160501087596&amp;postID=8030578613737499466' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/487124160501087596/posts/default/8030578613737499466'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/487124160501087596/posts/default/8030578613737499466'/><link rel='alternate' type='text/html' href='http://www.javajourneyman.com/2009/04/spring-mvc.html' title='Spring MVC'/><author><name>Andrew Will</name><uri>http://www.blogger.com/profile/05660726425091773836</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='25' src='http://bp3.blogger.com/_2-ZeSFOI_RE/SHVdKUuj15I/AAAAAAAAAEg/foscorvVu5c/S220/n506783965_126918_1801.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-487124160501087596.post-4710852302252118046</id><published>2008-11-30T14:50:00.007-07:00</published><updated>2008-12-07T22:55:13.481-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Spring Acquires "Groovy" Company</title><content type='html'>On November 11, &lt;a target="groovywin" href="http://www.springsource.com/node/837"&gt;Spring acquired the driving company behind Groovy and Grails&lt;/a&gt;. With many people touting Groovy as "next-gen" Java and the Groovy on Grails combination as Java's answer to Ruby on Rails, it will interesting to see what happens now the big boys at Spring have thrown their hat into the ring....&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Related Links&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a target="groovywin" href="http://www.springsource.com/node/837"&gt;SpringSource Acquires G2One Inc.&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/487124160501087596-4710852302252118046?l=www.javajourneyman.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.javajourneyman.com/feeds/4710852302252118046/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=487124160501087596&amp;postID=4710852302252118046' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/487124160501087596/posts/default/4710852302252118046'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/487124160501087596/posts/default/4710852302252118046'/><link rel='alternate' type='text/html' href='http://www.javajourneyman.com/2008/11/spring-acquires-groovy-company.html' title='Spring Acquires &quot;Groovy&quot; Company'/><author><name>Andrew Will</name><uri>http://www.blogger.com/profile/05660726425091773836</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='25' src='http://bp3.blogger.com/_2-ZeSFOI_RE/SHVdKUuj15I/AAAAAAAAAEg/foscorvVu5c/S220/n506783965_126918_1801.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-487124160501087596.post-1291049937196941801</id><published>2008-11-25T00:16:00.017-07:00</published><updated>2009-04-25T11:11:33.826-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tests'/><title type='text'>Java Compentancy Tests</title><content type='html'>After working at my previous employment for six years, I decided that I wanted a change. I contacted a couple of recruiters and thus began a 2-week adventure that led me to my current position.&lt;br /&gt;&lt;br /&gt;Since I was applying for a mid-level position and not a junior position, I had to take a few tests through a separate company that verified that I actually knew a little bit about Java. :-)&lt;br /&gt;&lt;br /&gt;Some of the hoops I had to jump through included taking about 6(!) online Java tests. I was quite surprised to find that many of these tests were weighted heavily towards testing one's knowledge of language syntax. For instance, a typical question could be worded like the following example &lt;span class="Apple-style-span" style="font-style: italic;"&gt;(NOTE: This was *NOT* actually one of the questions, but some of the questions did follow this "style")&lt;/span&gt;:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;   How do I print the word "andrew" to the console?&lt;br /&gt;&lt;br /&gt;   A. System.out.printline("andrew");&lt;br /&gt;   C. System.out.printLine("andrew");&lt;br /&gt;   C. System.out.println("andrew");&lt;br /&gt;   D. System.out.printLn("andrew");&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Is it really that important to test one's knowledge of Java method names? I had to really think about some of the questions as I usually use my IDE's auto-populate features to fill in method names as I need them....&lt;br /&gt;&lt;br /&gt;Also, some of the tests already seemed dated. I'm quite familiar with EJB 3.X syntax and semantics, but (thankfully) I missed the EJB 1.X and 2.X days so I struggled my way through many of the archaic EJB questions. Fortunately, EJB 3.X uses some of the same concepts as in EJB 1.X and 2.X so I was able to muddle through some of the questions.&lt;br /&gt;&lt;br /&gt;Another annoyance I found was getting quizzed on things like JSP implicit objects when I've spent the past two years avoiding scriptlets in my JSPs! That kind of threw me as I have tried to restrict myself to JSTL &amp; OGNL to retrieve values. By the way, there are &lt;a target="impwin" href="http://www.roseindia.net/jsp/jspfundamentals.shtml"&gt;8(!) implicit objects&lt;/a&gt;. Off the top of my head I could only think of four of them. :-)&lt;br /&gt;&lt;br /&gt;Anywho, I do not fault the test authors for the outdated questions. Java is a constantly changing ecosystem and trying to gauge one's knowledge of the Java platform is like trying to hit a moving target!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/487124160501087596-1291049937196941801?l=www.javajourneyman.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.javajourneyman.com/feeds/1291049937196941801/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=487124160501087596&amp;postID=1291049937196941801' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/487124160501087596/posts/default/1291049937196941801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/487124160501087596/posts/default/1291049937196941801'/><link rel='alternate' type='text/html' href='http://www.javajourneyman.com/2008/11/java-compentancy-tests.html' title='Java Compentancy Tests'/><author><name>Andrew Will</name><uri>http://www.blogger.com/profile/05660726425091773836</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='25' src='http://bp3.blogger.com/_2-ZeSFOI_RE/SHVdKUuj15I/AAAAAAAAAEg/foscorvVu5c/S220/n506783965_126918_1801.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-487124160501087596.post-2185225236652276265</id><published>2008-08-11T12:16:00.004-07:00</published><updated>2008-08-11T23:15:59.808-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='idea'/><category scheme='http://www.blogger.com/atom/ns#' term='seam'/><title type='text'>IntelliJ IDEA 8 Milestone 1</title><content type='html'>As announced &lt;a href="http://jetbrains.dzone.com/news/888-intellij-idea-8-milestone-" target="newwin1"&gt;here&lt;/a&gt;, IntelliJ IDEA 8 Milestone 1 was released on August 8. One of the &lt;a href="http://www.jetbrains.com/idea/nextversion/index.html?dzone" target="newwin4"&gt;new features&lt;/a&gt; that I look forward to trying out is the improved &lt;a href="http://www.jetbrains.com/idea/training/demos/seam-development.html" target="newwin4"&gt;JBoss Seam support&lt;/a&gt; and improved &lt;a href="http://www.jetbrains.com/idea/training/demos/javascript-debugger.html" target="newwin5"&gt;JavaScript debugger&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I was very impressed with the &lt;a href="http://www.jetbrains.com/idea/training/demos/seam-development.html" target="newwin4"&gt;Seam demo&lt;/a&gt; and hope to take the new features for a test drive soon. I thoroughly enjoy the flash demos that JetBrains uses to introduce users to the various features that IDEA has to offer. Besides being very informative, each presentation is injected with various attempts at humor which successfully keeps me paying attention (with an occasional head shake and groan, though! ;-).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Related Links&lt;/span&gt;:&lt;ul&gt;&lt;li&gt;&lt;a href="http://jetbrains.dzone.com/news/888-intellij-idea-8-milestone-" target="newwin1"&gt;IntelliJ IDEA 8 Milestone 1 released&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.jetbrains.com/idea/nextversion/index.html?dzone" target="newwin3"&gt;Features and Download&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.jetbrains.com/idea/training/demos/seam-development.html" target="newwin4"&gt;IntelliJ IDEA 8 Seam Demo&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.jetbrains.com/idea/training/demos/javascript-debugger.html" target="newwin4"&gt;IntelliJ IDEA 8 JavaScript Debugger&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/487124160501087596-2185225236652276265?l=www.javajourneyman.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.javajourneyman.com/feeds/2185225236652276265/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=487124160501087596&amp;postID=2185225236652276265' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/487124160501087596/posts/default/2185225236652276265'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/487124160501087596/posts/default/2185225236652276265'/><link rel='alternate' type='text/html' href='http://www.javajourneyman.com/2008/08/intellij-idea-8-milestone-1.html' title='IntelliJ IDEA 8 Milestone 1'/><author><name>Andrew Will</name><uri>http://www.blogger.com/profile/05660726425091773836</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='25' src='http://bp3.blogger.com/_2-ZeSFOI_RE/SHVdKUuj15I/AAAAAAAAAEg/foscorvVu5c/S220/n506783965_126918_1801.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-487124160501087596.post-2799158693218359885</id><published>2008-08-02T21:23:00.006-07:00</published><updated>2009-02-19T21:59:11.314-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='orm'/><title type='text'>Evaluating iBATIS, Hibernate, and JPA</title><content type='html'>For those new to &lt;a href="http://en.wikipedia.org/wiki/Object-relational_mapping" target="newwin1"&gt;ORM&lt;/a&gt;, choosing an ORM solution can be quite a daunting task! To many, the mention of ORM brings back &lt;a href="http://www.amazon.com/Bitter-EJB-Bruce-Tate/dp/1930110952/ref=pd_bbs_sr_1?ie=UTF8&amp;s=books&amp;qid=1218055057&amp;sr=8-1" target="newnwin10"&gt;bitter memories&lt;/a&gt; of working with EJB 1.X or 2.X. The many problems associated with the first and second generations of EJB pushed developers to look elsewhere for ORM solutions.&lt;br /&gt;&lt;br /&gt;Today, Java developers are far from being bereft of options when it comes to ORM solutions. Three of the more popular options include &lt;a href="http://ibatis.apache.org/" target="newwin4"&gt;iBATIS&lt;/a&gt;, &lt;a href="http://www.hibernate.org/" target="newwin5"&gt;Hibernate&lt;/a&gt;, and &lt;a href="http://java.sun.com/developer/technicalArticles/J2EE/jpa/" target="newwin6"&gt;JPA&lt;/a&gt;. Java World has published &lt;a href="http://www.javaworld.com/javaworld/jw-07-2008/jw-07-orm-comparison.html" target="newwin2"&gt;an excellent article&lt;/a&gt; articulating each of these frameworks and discussing the pros and cons of each one.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Related Links&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.javaworld.com/javaworld/jw-07-2008/jw-07-orm-comparison.html" target="newwin3"&gt;iBATIS, Hibernate, and JPA: Which is right for you?&lt;/a&gt;&lt;br/&gt;Object-relational mapping solutions compared&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/487124160501087596-2799158693218359885?l=www.javajourneyman.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.javajourneyman.com/feeds/2799158693218359885/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=487124160501087596&amp;postID=2799158693218359885' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/487124160501087596/posts/default/2799158693218359885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/487124160501087596/posts/default/2799158693218359885'/><link rel='alternate' type='text/html' href='http://www.javajourneyman.com/2008/08/evaluating-ibatis-hibernate-and-jpa.html' title='Evaluating iBATIS, Hibernate, and JPA'/><author><name>Andrew Will</name><uri>http://www.blogger.com/profile/05660726425091773836</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='25' src='http://bp3.blogger.com/_2-ZeSFOI_RE/SHVdKUuj15I/AAAAAAAAAEg/foscorvVu5c/S220/n506783965_126918_1801.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-487124160501087596.post-932824933284120551</id><published>2008-07-25T22:07:00.012-07:00</published><updated>2009-06-29T22:23:28.305-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='conferences'/><title type='text'>No Fluff Just Stuff @ Phoenix</title><content type='html'>Today was the first day of the &lt;a href="http://www.nofluffjuststuff.com/" target="newwin1"&gt;No Fluff Just Stuff&lt;/a&gt; Symposium in my hometown of Phoenix, AZ. If you haven't been to one, I highly recommend you give one a try. This year's tour in &lt;a href="http://www.nofluffjuststuff.com/conference/phoenix/2008/07/index.html" target="newwin2"&gt;Phoenix&lt;/a&gt; will be the second one I've attended. Even if you cannot get your company to chip in towards the fee, it's still worth the price of admission. Both times (2007 &amp; 2008) I have had to pay the full price out of my own pocket, but I have no complaints. I definitely feel like I got my money's worth.&lt;br /&gt;&lt;br /&gt;Today I attended the following sessions:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Concurrency (Parts 1 and 2)&lt;/span&gt; - &lt;a href="http://www.nofluffjuststuff.com/conference/speaker/ted_neward.html" target="newwin3"&gt;Ted Neward&lt;/a&gt;&lt;br /&gt;Most of the code I do at work does deal with threading issues, but as most of today's machines now have more than one CPU I thought it would be a good idea to brush up on my thread knowledge. Besides threading and concurrency basics, Neward also goes over features introduced in Java 5 (e.g. locks, java.util.concurrency.*, etc).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;10 Ways to Improve Your Code&lt;/span&gt; - &lt;a href="http://www.nofluffjuststuff.com/conference/speaker/neal_ford.html" target="newwin4"&gt;Neil Ford&lt;/a&gt;&lt;br /&gt;I really enjoy hearing Neil Ford's talks. His book &lt;a href="http://www.amazon.com/Art-Java-Web-Development-InternetBeans/dp/1932394060/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1217222612&amp;sr=8-1" target="newwin5"&gt;Art of Java Web Development&lt;/a&gt; provides a great overview and comparison of web frameworks. John Water's &lt;a href="http://www.theregister.co.uk/2008/03/10/ten_ways_to_improve_code/" target="newwin6"&gt;blog entry&lt;/a&gt; describes each of Neil Ford's 10 principles.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/487124160501087596-932824933284120551?l=www.javajourneyman.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.javajourneyman.com/feeds/932824933284120551/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=487124160501087596&amp;postID=932824933284120551' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/487124160501087596/posts/default/932824933284120551'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/487124160501087596/posts/default/932824933284120551'/><link rel='alternate' type='text/html' href='http://www.javajourneyman.com/2008/07/no-fluff-just-stuff-phoenix-day-1-of-3.html' title='No Fluff Just Stuff @ Phoenix'/><author><name>Andrew Will</name><uri>http://www.blogger.com/profile/05660726425091773836</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='25' src='http://bp3.blogger.com/_2-ZeSFOI_RE/SHVdKUuj15I/AAAAAAAAAEg/foscorvVu5c/S220/n506783965_126918_1801.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-487124160501087596.post-5200140443103972805</id><published>2008-07-21T18:19:00.004-07:00</published><updated>2008-07-22T02:38:48.113-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='security'/><title type='text'>Importance of Physical Security</title><content type='html'>Today &lt;a href="http://news.cnet.com/8301-1009_3-9995479-83.html" target="newwin1"&gt;CNET&lt;/a&gt; published an interesting article entitled &lt;a href="http://news.cnet.com/8301-1009_3-9995479-83.html" target="newwin2"&gt;Hacking With No Technology&lt;/a&gt; where Johnny Long, a security researcher, successfully compromised a multimillion-dollar security system. Did he use some sophisticated hacking software or some elaborate hardware solution? No, he took a coat hanger and a rag and proceeded to break the window in the door. He then reached in with the straightened coat hanger and the door opened.&lt;br /&gt;&lt;br /&gt;As technologists and IT professionals, we "live" in the digital world and we are always trying to solve digital problems and possibilities. I think sometimes we forget that at the end of the day our hardware exists in the physical world and the most secure network and tightened-down software security system cannot defeat an unlocked door or faulty lock.... :-)&lt;br /&gt;&lt;br /&gt;CNET Article:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://news.cnet.com/8301-1009_3-9995479-83.html" target="newwin2"&gt;Hacking With No Technology&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/487124160501087596-5200140443103972805?l=www.javajourneyman.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.javajourneyman.com/feeds/5200140443103972805/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=487124160501087596&amp;postID=5200140443103972805' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/487124160501087596/posts/default/5200140443103972805'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/487124160501087596/posts/default/5200140443103972805'/><link rel='alternate' type='text/html' href='http://www.javajourneyman.com/2008/07/importance-of-physical-security.html' title='Importance of Physical Security'/><author><name>Andrew Will</name><uri>http://www.blogger.com/profile/05660726425091773836</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='25' src='http://bp3.blogger.com/_2-ZeSFOI_RE/SHVdKUuj15I/AAAAAAAAAEg/foscorvVu5c/S220/n506783965_126918_1801.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-487124160501087596.post-4202301743027537197</id><published>2008-07-19T04:52:00.002-07:00</published><updated>2008-07-20T23:18:56.279-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='reflection'/><category scheme='http://www.blogger.com/atom/ns#' term='struts 2'/><category scheme='http://www.blogger.com/atom/ns#' term='annotations'/><title type='text'>Session Value Retrieval with Struts 2 (Part 2 of 2)</title><content type='html'>As mentioned in &lt;a href="http://javajourneyman.blogspot.com/2008/07/session-value-retrieval-with-struts2.html"&gt;Part 1&lt;/a&gt;, a sample application was developed demonstrating the &lt;code&gt;SessionValue&lt;/code&gt; annotation.&lt;br /&gt;&lt;br /&gt;The application can be downloaded here:&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.doulosdev.net/files/20080719annex.jar"&gt;20080719annex.jar&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;After downloading the JAR file, extract it and use Apache Ant to build a WAR file to deploy on Tomcat.&lt;pre&gt;&lt;br /&gt;   jar xvf 20080719annex.jar -- extract the JAR file&lt;br /&gt;   ant war                   -- generate a WAR file&lt;br /&gt;&lt;/pre&gt;Once you have generated the WAR file, place it in Tomcat's &lt;code&gt;webapps&lt;/code&gt; directory and start Tomcat. The application was developed using &lt;a href="http://java.sun.com/javase/downloads/index.jsp" target="newwin1"&gt;Java 6&lt;/a&gt; and deployed on &lt;a href="http://tomcat.apache.org/download-60.cgi" target="newwin2"&gt;Tomcat 6&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;When the application is deployed, browse to the application (probably located at &lt;a href="http://localhost:8080/annex" target="newwin3"&gt;http://localhost:8080/annex&lt;/a&gt; if you are using the default settings). The following screen should greet you:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_2-ZeSFOI_RE/SIHWcBaTCsI/AAAAAAAAAF8/_zDaq1zxMLc/s1600-h/agen.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_2-ZeSFOI_RE/SIHWcBaTCsI/AAAAAAAAAF8/_zDaq1zxMLc/s400/agen.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5224692819629902530" /&gt;&lt;/a&gt;&lt;br /&gt;Clicking on the link will generate a random user and a random quote and place these two things on the session. After clicking on the link, the following screen will appear and display the random user and quote:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_2-ZeSFOI_RE/SIHXIyD6hvI/AAAAAAAAAGM/3UZNdpLQLYo/s1600-h/aread.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_2-ZeSFOI_RE/SIHXIyD6hvI/AAAAAAAAAGM/3UZNdpLQLYo/s400/aread.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5224693588603602674" /&gt;&lt;/a&gt;&lt;br /&gt;Click on the link to generate more random values.&lt;br /&gt;&lt;br /&gt;The application is made up of two actions. The first action generates random data and the second action has the session data injected into it via reflection and the &lt;code&gt;SessionValue&lt;/code&gt; annotation.&lt;br /&gt;&lt;br /&gt;The following is the code for the &lt;code&gt;ReadSessionData&lt;/code&gt; action:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;  /////////////////////////////////////////////////////////&lt;br /&gt;  // ReadSessionData.java&lt;br /&gt;&lt;br /&gt;  public class ReadSessionData extends ActionSupport {&lt;br /&gt;&lt;br /&gt;      private User user;&lt;br /&gt;&lt;br /&gt;      private String message;&lt;br /&gt;&lt;br /&gt;      @Override&lt;br /&gt;      public String execute() {&lt;br /&gt;          System.out.println("\nReadSessionData found the following values:");&lt;br /&gt;          System.out.println("user:    " + user);&lt;br /&gt;          System.out.println("message: " + message);&lt;br /&gt;          return SUCCESS;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      public User getUser() {&lt;br /&gt;          return user;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      @SessionValue(id = "user")&lt;br /&gt;      public void setUser(User user) {&lt;br /&gt;          this.user = user;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      public String getMessage() {&lt;br /&gt;          return message;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      @SessionValue(id = "message")&lt;br /&gt;      public void setMessage(String message) {&lt;br /&gt;          this.message = message;&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The interceptor described in the &lt;a href="http://javajourneyman.blogspot.com/2008/07/session-value-retrieval-with-struts2.html"&gt;previous post&lt;/a&gt; intercepts this action and injects the user and message dependencies with the values on the session that respectively have the IDs of &lt;code&gt;"user"&lt;/code&gt; and &lt;code&gt;"message"&lt;/code&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/487124160501087596-4202301743027537197?l=www.javajourneyman.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.javajourneyman.com/feeds/4202301743027537197/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=487124160501087596&amp;postID=4202301743027537197' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/487124160501087596/posts/default/4202301743027537197'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/487124160501087596/posts/default/4202301743027537197'/><link rel='alternate' type='text/html' href='http://www.javajourneyman.com/2008/07/session-value-retrieval-with-struts-2.html' title='Session Value Retrieval with Struts 2 (Part 2 of 2)'/><author><name>Andrew Will</name><uri>http://www.blogger.com/profile/05660726425091773836</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='25' src='http://bp3.blogger.com/_2-ZeSFOI_RE/SHVdKUuj15I/AAAAAAAAAEg/foscorvVu5c/S220/n506783965_126918_1801.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_2-ZeSFOI_RE/SIHWcBaTCsI/AAAAAAAAAF8/_zDaq1zxMLc/s72-c/agen.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-487124160501087596.post-232497679424115041</id><published>2008-07-18T22:15:00.009-07:00</published><updated>2009-04-25T10:52:30.964-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='reflection'/><category scheme='http://www.blogger.com/atom/ns#' term='struts 2'/><category scheme='http://www.blogger.com/atom/ns#' term='annotations'/><title type='text'>Session Value Retrieval with Struts 2 (Part 1 of 2)</title><content type='html'>Struts provides different ways to read objects from the session -- the most obvious way being to implement &lt;code&gt;SessionAware&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;[ Side note -- Interestingly enough, there may have been talk of deprecating SessionAware in WebWork's early days according to an old &lt;a target="newwin" href="http://wiki.opensymphony.com/display/WW1/SessionAware+Actions"&gt;WebWork wiki&lt;/a&gt;. Does anyone have any more information about this? ]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;By implementing &lt;a target="newwin" href="http://struts.apache.org/2.0.11/struts2-core/apidocs/org/apache/struts2/interceptor/SessionAware.html"&gt;&lt;code&gt;SessionAware&lt;/code&gt;&lt;/a&gt;, you provide a method that allows a Struts 2 interceptor to inject the session dependency into the appropriate action.&lt;br /&gt;&lt;br /&gt;Basically, your code looks something like this:&lt;pre class="prettyprint"&gt;&lt;br /&gt;  /////////////////////////////////////////////////////////&lt;br /&gt;  // SomeAction.java&lt;br /&gt;&lt;br /&gt;  public class SomeAction extends ActionSupport&lt;br /&gt;          implements SessionAware {&lt;br /&gt;&lt;br /&gt;      private Map&amp;lt;Object, Object&amp;gt; session;&lt;br /&gt;&lt;br /&gt;      private Object someObjectFromSession;&lt;br /&gt;&lt;br /&gt;      @Override&lt;br /&gt;      public String execute() {&lt;br /&gt;          someObjectFromSession = session.get("someKey");&lt;br /&gt;&lt;br /&gt;          // ... do something ...&lt;br /&gt;&lt;br /&gt;          return SUCCESS;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      @SuppressWarnings("unchecked");&lt;br /&gt;      public void setSession(Map session) {&lt;br /&gt;          this.session = session;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      // ... other methods ...&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;A Struts interceptor intercepts this action and injects the session into the action. That's fine, but most of the time I just want one or two things from the session and I really do not need the entire session object.&lt;br /&gt;&lt;br /&gt;Another way to read objects from the session is to create your own &lt;code&gt;&amp;lt;SomeObject&amp;gt;Aware&lt;/code&gt; interfaces and then create interceptors to retrieve your necessary session objects. For instance, if you logged in a user and then wanted to retrieve this user from the session, you could implement something like this:&lt;pre class="prettyprint"&gt;&lt;br /&gt;  /////////////////////////////////////////////////////////&lt;br /&gt;  // SomeAction.java&lt;br /&gt;&lt;br /&gt;  public class SomeAction extends ActionSupport implements UserAware {&lt;br /&gt;&lt;br /&gt;      private User user;&lt;br /&gt;&lt;br /&gt;      @Override&lt;br /&gt;      public String execute() {&lt;br /&gt;&lt;br /&gt;          // ... do something ...&lt;br /&gt;&lt;br /&gt;          return SUCCESS;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      public void setUser(User user) {&lt;br /&gt;          this.session = session;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      // ... other methods ...&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  /////////////////////////////////////////////////////////&lt;br /&gt;  // UserInterceptor.java&lt;br /&gt;&lt;br /&gt;  public class UserInterceptor extends AbstractInterceptor {&lt;br /&gt;&lt;br /&gt;      public UserInterceptor() {&lt;br /&gt;          super();&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      @SuppressWarnings("unchecked")&lt;br /&gt;      public String intercept(ActionInvocation invocation)&lt;br /&gt;              throws Exception {&lt;br /&gt;&lt;br /&gt;          Map&amp;lt;Object,Object&amp;gt; session =&lt;br /&gt;                  invocation.getInvocationContext().getSession();&lt;br /&gt;&lt;br /&gt;          User user = (User)session.get("user");&lt;br /&gt;&lt;br /&gt;          // ... handle case if no user on session ...&lt;br /&gt;&lt;br /&gt;          Object action = invocation.getAction();&lt;br /&gt;          if (action instanceof UserAware) {&lt;br /&gt;              ((UserAware)action).setUser(user);&lt;br /&gt;          }&lt;br /&gt;&lt;br /&gt;          return invocation.invoke();&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;I prefer the second way because it injects just the object you need into the action rather than the entire session map. However, I had actions that required more than one value from the session and I did not want to implement a corresponding interface and interceptor for each value. I wanted one interceptor to perform all the legwork for me. There already is a &lt;a href="http://cwiki.apache.org/S2PLUGINS/scope-plugin.html" target="newwin20"&gt;great solution&lt;/a&gt; that is freely available that I use with my own stuff, but I decided to create my own solution just for the experience and to become more familiar with the Java Reflection API. I created an annotation and then used an interceptor to inject the dependency if the annotation was in place. For instance, the preceding example would be implemented like this:&lt;pre class="prettyprint"&gt;&lt;br /&gt;  /////////////////////////////////////////////////////////&lt;br /&gt;  // SessionValue.java&lt;br /&gt;&lt;br /&gt;  @Retention(RetentionPolicy.RUNTIME)&lt;br /&gt;  @Target(ElementType.METHOD)&lt;br /&gt;  public @interface SessionValue {&lt;br /&gt;      public String id();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  /////////////////////////////////////////////////////////&lt;br /&gt;  // SomeAction.java&lt;br /&gt;&lt;br /&gt;  public class SomeAction extends ActionSupport {&lt;br /&gt;&lt;br /&gt;      private User user;&lt;br /&gt;&lt;br /&gt;      @Override&lt;br /&gt;      public String execute() {&lt;br /&gt;&lt;br /&gt;          // ... do something ...&lt;br /&gt;&lt;br /&gt;          return SUCCESS;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      @SessionValue(id = "user")&lt;br /&gt;      public void setUser(User user) {&lt;br /&gt;          this.session = session;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      // ... other methods ...&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  /////////////////////////////////////////////////////////&lt;br /&gt;  // SessionValueLookupInterceptor.java&lt;br /&gt;&lt;br /&gt;  public class SessionValueLookupInterceptor extends AbstractInterceptor {&lt;br /&gt;&lt;br /&gt;      public SessionValueLookupInterceptor () {&lt;br /&gt;          super();&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      @SuppressWarnings("unchecked")&lt;br /&gt;      public String intercept(ActionInvocation invocation)&lt;br /&gt;              throws Exception {&lt;br /&gt;&lt;br /&gt;          Map&amp;lt;Object, Object&amp;gt; session =&lt;br /&gt;                  invocation.getInvocationContext().getSession();&lt;br /&gt;&lt;br /&gt;          Object action = invocation.getAction();&lt;br /&gt;&lt;br /&gt;          for (Method m : action.getClass().getMethods()) {&lt;br /&gt;              if (m.isAnnotationPresent(SessionValue.class)) {&lt;br /&gt;                   if (m.getName().startsWith("set")) {&lt;br /&gt;                       SessionValue ann = m.getAnnotation(SessionValue.class);&lt;br /&gt;                       String id = ann.id();&lt;br /&gt;                       Object obj = session.get(id);&lt;br /&gt;&lt;br /&gt;                       m.invoke(action, obj);&lt;br /&gt;                   }&lt;br /&gt;              }&lt;br /&gt;          }&lt;br /&gt;&lt;br /&gt;          return invocation.invoke();&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;Now, the interceptor uses reflection to check if any of the action's setter methods have the &lt;code&gt;SessionValue&lt;/code&gt; annotation. If the method does have the annotation, the interceptor tries to envoke the setter method with the object on the session who has an ID of the value specified in the annotation. In other words, in the preceding example the interceptor retrieves the object from the session whose ID is &lt;code&gt;"user"&lt;/code&gt; and envokes the action's &lt;code&gt;setUser&lt;/code&gt; method.&lt;br /&gt;&lt;br /&gt;The nice thing about the preceding example is that &lt;span style="font-style:italic"&gt;that&lt;/span&gt; interceptor is the &lt;span style="font-style:italic"&gt;only&lt;/span&gt; interceptor you need to implement to retreive &lt;span style="font-style:italic"&gt;any&lt;/span&gt; object from the session. Simply put the &lt;code&gt;SessionValue&lt;/code&gt; annotation above the appropriate setter method, add the interceptor to your interceptor stack and you are good to go.&lt;br /&gt;&lt;br /&gt;Note that the preceding was a basic example and some additional sanity checks may be necessary for your own application (e.g. &lt;code&gt;null&lt;/code&gt; object condition, better exception handling in interceptor, etc.), but I hope that's enough to get you going. Feel free to use/change/whatever the preceding code for your own application development. In &lt;a href="http://javajourneyman.blogspot.com/2008/07/session-value-retrieval-with-struts-2.html"&gt;my next post&lt;/a&gt;, I will post an example of the annotation in action.&lt;br /&gt;&lt;br /&gt;If you are new to annotations and reflection, the following link provides a some information and a quick example:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://java.sun.com/j2se/1.5.0/docs/guide/language/annotations.html" target="newwin"&gt;Sun's Java 1.5 Annotation page&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; As stated previously, there already is &lt;a href="http://cwiki.apache.org/S2PLUGINS/scope-plugin.html" target="newwin21"&gt;a great solution&lt;/a&gt; out there so if you are looking for code that's ready for prime time, use that instead, but feel free to download the previous example if you're looking for an introduction to see annotations and reflection in action.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/487124160501087596-232497679424115041?l=www.javajourneyman.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.javajourneyman.com/feeds/232497679424115041/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=487124160501087596&amp;postID=232497679424115041' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/487124160501087596/posts/default/232497679424115041'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/487124160501087596/posts/default/232497679424115041'/><link rel='alternate' type='text/html' href='http://www.javajourneyman.com/2008/07/session-value-retrieval-with-struts2.html' title='Session Value Retrieval with Struts 2 (Part 1 of 2)'/><author><name>Andrew Will</name><uri>http://www.blogger.com/profile/05660726425091773836</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='25' src='http://bp3.blogger.com/_2-ZeSFOI_RE/SHVdKUuj15I/AAAAAAAAAEg/foscorvVu5c/S220/n506783965_126918_1801.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-487124160501087596.post-4557667746612622915</id><published>2008-07-16T10:42:00.000-07:00</published><updated>2008-07-17T01:25:03.704-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='idea'/><title type='text'>Intellij IDEA Web Facet Settings</title><content type='html'>I've been using &lt;a target="newwin" href="http://www.jetbrains.com/idea/"&gt;IDEA &lt;/a&gt;for about six months now and I really like it so far. Usually I am importing existing &lt;a target="newwin" href="http://www.eclipse.org/"&gt;Eclipse&lt;/a&gt; projects into IDEA for work reasons, but yesterday I decided to try and set up a &lt;a target="newwin" href="http://struts.apache.org/2.x/"&gt;Struts 2&lt;/a&gt; project from scratch.&lt;br /&gt;&lt;br /&gt;I had some problems deploying the app, but then I realized I had not properly set a couple of the &lt;span style="font-style:italic;"&gt;Web Facet&lt;/span&gt; properties. In case anyone else makes the same mistakes I did, here's the settings I needed. To get to the &lt;span style="font-style:italic;"&gt;Web Facet&lt;/span&gt; properties, go to &lt;span style="font-style:italic;"&gt;Settings&lt;/span&gt; (&lt;code&gt;CTRL + ALT + S&lt;/code&gt;) and select &lt;span style="font-style:italic;"&gt;Project Settings&lt;/span&gt;. Select the &lt;span style="font-style:italic;"&gt;Web&lt;/span&gt; facet under the module in question.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Modules and Libraries to Package&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_2-ZeSFOI_RE/SH41QCD1xQI/AAAAAAAAAFs/ecePNFuL_PE/s1600-h/copyFilesTo.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_2-ZeSFOI_RE/SH41QCD1xQI/AAAAAAAAAFs/ecePNFuL_PE/s400/copyFilesTo.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5223671167343510786" /&gt;&lt;/a&gt;&lt;br /&gt;If the libraries you are using in your module are not already installed in your application server, you will have to change the packaging method of your library from &lt;span style="font-style:italic;"&gt;Do Not Package&lt;/span&gt; to &lt;span style="font-style:italic;"&gt;Copy Files To&lt;/span&gt;. This will include your libraries when deploying the app. Notice that I did not include &lt;code&gt;javaee.jar&lt;/code&gt; as the functionality in this jar file I require is already included in my application server.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Source Roots&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_2-ZeSFOI_RE/SH44JU4HXRI/AAAAAAAAAF0/w5E853WMxSA/s1600-h/src.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_2-ZeSFOI_RE/SH44JU4HXRI/AAAAAAAAAF0/w5E853WMxSA/s400/src.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5223674350670404882" /&gt;&lt;/a&gt;&lt;br /&gt;If you have multiple source directories that need to be deployed, make sure you put a check mark next to &lt;span style="font-style:italic;"&gt;ALL&lt;/span&gt; the directories you want deploy. I like to place all my Struts 2 XML files in their own source directory (&lt;code&gt;src-config&lt;/code&gt;) and by default this directory was not checked.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/487124160501087596-4557667746612622915?l=www.javajourneyman.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.javajourneyman.com/feeds/4557667746612622915/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=487124160501087596&amp;postID=4557667746612622915' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/487124160501087596/posts/default/4557667746612622915'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/487124160501087596/posts/default/4557667746612622915'/><link rel='alternate' type='text/html' href='http://www.javajourneyman.com/2008/07/intellij-idea-web-facet-settings.html' title='Intellij IDEA Web Facet Settings'/><author><name>Andrew Will</name><uri>http://www.blogger.com/profile/05660726425091773836</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='25' src='http://bp3.blogger.com/_2-ZeSFOI_RE/SHVdKUuj15I/AAAAAAAAAEg/foscorvVu5c/S220/n506783965_126918_1801.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_2-ZeSFOI_RE/SH41QCD1xQI/AAAAAAAAAFs/ecePNFuL_PE/s72-c/copyFilesTo.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-487124160501087596.post-4242206118308694858</id><published>2008-07-12T00:30:00.002-07:00</published><updated>2009-02-19T21:59:34.737-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='orm'/><title type='text'>Deleting References w/ JPA</title><content type='html'>In my &lt;a href="http://javajourneyman.blogspot.com/2008/07/jpa-videos.html"&gt;previous post&lt;/a&gt; I linked to three excellent videos on JPA. &lt;a href="http://www.parleys.com/display/PARLEYS/Home#slide=1;talk=2555996;title=Writing%20JPA%20applications"&gt;One of them&lt;/a&gt; answered a question that had bothered me since I first started using JPA.&lt;br /&gt;&lt;br /&gt;One thing that bugged me was trying to delete an object of a particular ID. Since the &lt;code&gt;EntityManager&lt;/code&gt; deals with objects, I assumed you had to first &lt;span style="font-style:italic;"&gt;find&lt;/span&gt; the object before deleting it. For instance, say we have an &lt;code&gt;Order&lt;/code&gt; w/ an ID of 17, but all I currently have is the ID value of 17. I thought that you had to do the following to delete the order:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;code&gt;em.delete(&lt;span style="font-weight:bold;"&gt;em.find(Order.class, 17)&lt;/span&gt;);&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;This bugged me because it seemed like an unnecessary lookup. Why do I need to &lt;span style="font-style:italic;"&gt;find&lt;/span&gt; the object if I just want to &lt;span style="font-style:italic;"&gt;delete&lt;/span&gt; the object w/ the associated ID? Well, as &lt;a href="http://www.parleys.com/display/PARLEYS/Home#slide=1;talk=2555996;title=Writing%20JPA%20applications"&gt;covered in the video&lt;/a&gt; (slide 35 + 36), JPA has a way around that:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;code&gt;em.delete(&lt;span style="font-weight:bold;"&gt;em.getReference(Order.class, 17)&lt;/span&gt;);&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Essentially, JPA creates a "hollow" reference that it then deletes, preventing the unnecessary lookup in the first example. Sure you could accomplish this using a Delete JPQL statement, but as the presenter points out -- using JPQL with a primary key as the parameter usually indicates an anti-pattern to avoid.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/487124160501087596-4242206118308694858?l=www.javajourneyman.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.javajourneyman.com/feeds/4242206118308694858/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=487124160501087596&amp;postID=4242206118308694858' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/487124160501087596/posts/default/4242206118308694858'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/487124160501087596/posts/default/4242206118308694858'/><link rel='alternate' type='text/html' href='http://www.javajourneyman.com/2008/07/deleting-references-w-jpa_12.html' title='Deleting References w/ JPA'/><author><name>Andrew Will</name><uri>http://www.blogger.com/profile/05660726425091773836</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='25' src='http://bp3.blogger.com/_2-ZeSFOI_RE/SHVdKUuj15I/AAAAAAAAAEg/foscorvVu5c/S220/n506783965_126918_1801.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-487124160501087596.post-4971359529852705550</id><published>2008-07-11T22:13:00.002-07:00</published><updated>2009-02-19T21:59:45.413-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='orm'/><title type='text'>JPA Videos</title><content type='html'>&lt;a target="newwin" href="http://www.parleys.com/"&gt;Parleys.com&lt;/a&gt; has posted some excellent videos for anyone wanting more info on the Java Persistence Framework. The videos are geared for people who have at least had &lt;span style="font-style:italic;"&gt;some&lt;/span&gt; exposure to JPA programming. Also, the videos use some persistence annotations (e.g. &lt;code&gt;@PersistenceContext&lt;/code&gt;) so it's helpful if you've already seen those before and are at least familiar with the concept of session beans.&lt;ul&gt;&lt;li&gt;&lt;a target="newwin" href="http://www.parleys.com/display/PARLEYS/Home#slide=1;talk=2555996;title=Writing%20JPA%20applications"&gt;Writing JPA Applications&lt;/a&gt; - Patrick Linskey&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a target="newwin" href="http://www.parleys.com/display/PARLEYS/Home#talk=4653242;title=Advanced%20Topics%20in%20JPA;slide=1"&gt;Advanced Topics in JPA&lt;/a&gt; - Mike Keith&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a target="newwin" href="http://www.parleys.com/display/PARLEYS/Home#talk=8093865;title=Java%20Persistence%202.0;slide=1"&gt;Java Persistence 2.0&lt;/a&gt; - Linda DeMichiel&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;a style="font-weight:bold" target="newwin" href="http://www.parleys.com/display/PARLEYS/Home#slide=1;talk=2555996;title=Writing%20JPA%20applications"&gt;Writing JPA Applications&lt;/a&gt; - Patrick Linskey&lt;br /&gt;An excellent intermediate-level JPA overview. I appreciated the segment concerning specifying meta-data via a "merged view" that split the meta-data between annotations and XML. I found Linskey's information to be very informative and useful.&lt;br /&gt;&lt;br /&gt;The video includes some very helpful examples (including JPQL and native queries) that I was able to immediately apply to what I was working on -- one of which I discuss in my next post.&lt;br /&gt;&lt;br /&gt;&lt;a style="font-weight:bold" target="newwin" href="http://www.parleys.com/display/PARLEYS/Home#talk=4653242;title=Advanced%20Topics%20in%20JPA;slide=1"&gt;Advanced Topics in JPA&lt;/a&gt; - Mike Keith&lt;br /&gt;Interesting topics like compound identities and disabling(!) annotations are covered. A lot of what's covered I have not come up against in my normal day-to-day JPA programming, but it is still nice to see what's available to me in case I need it &lt;span style="font-style:italic;"&gt;someday&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a style="font-weight:bold" target="newwin" href="http://www.parleys.com/display/PARLEYS/Home#talk=8093865;title=Java%20Persistence%202.0;slide=1"&gt;Java Persistence 2.0&lt;/a&gt; - Linda DeMichiel&lt;br /&gt;A good overview of possibilities to come. Personally, I like the sound of built-in validation annotations in JPA. Right now, I'm using &lt;a target="newwin" href="http://www.hibernate.org/"&gt;Hibernate&lt;/a&gt;'s validation annotations in my &lt;a target="newwin" href="http://seamframework.org/"&gt;Seam Framework&lt;/a&gt; applications and those work fine, but it would be nice to use some standard validation annotations instead.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/487124160501087596-4971359529852705550?l=www.javajourneyman.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.javajourneyman.com/feeds/4971359529852705550/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=487124160501087596&amp;postID=4971359529852705550' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/487124160501087596/posts/default/4971359529852705550'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/487124160501087596/posts/default/4971359529852705550'/><link rel='alternate' type='text/html' href='http://www.javajourneyman.com/2008/07/jpa-videos.html' title='JPA Videos'/><author><name>Andrew Will</name><uri>http://www.blogger.com/profile/05660726425091773836</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='25' src='http://bp3.blogger.com/_2-ZeSFOI_RE/SHVdKUuj15I/AAAAAAAAAEg/foscorvVu5c/S220/n506783965_126918_1801.jpg'/></author><thr:total>2</thr:total></entry></feed>
