Thursday, July 2, 2009

Hibernate - Annotations vs XML

Recently I was involved in a healthy discussion at my work on using Annotations for Entities. We have a Java web application with Spring MVC, Hibernate and Entities with hbm.xml files. Entities with XML work well however there is an interest in the team to use annotations. Here are my thoughts - pros and cons of each approach. I have used both approaches, however I like using hbm xml files over annotations for entities. That said I do like the use of annotations in Spring MVC, TestNG, or on service layers to mark transactions.
Why stick to hbm.xml files?
  1. Well, if we think back to days before hibernate, when we used JDBC we had the problem where the SQL code was embedded in Java classes, thus causing many maintainability problems. With Hibernate xml files we got a clean way to keep them seperate - the entity pojo's were free of the sql clutter. With Annotations in Entites we are going back to that same model !!!
  2. Entities are cross cutting code - they are used in all layers, starting from DB all the way to JSP in many cases. Cross cutting logic should not have code that looks more biased to a certain layer.
  3. If you are working in a team that is split into Backend Dev team and frontend dev team then the front end team does not need to see all those annotations. Well what would be the argument if frontend team wants to add their own View specific annotations to entities for ease of use?
  4. If you have a code base that takes long time to compile and build (fortunately for us it takes a few seconds), having an hbm xml file is better. No need to recompile.
  5. If you have to migrate from xml to annotations on an existing ongoing project what is cost justification to use annotations?
Why move to Annotations?
  1. Well, as my collegue at work explains, it improves maintainability by having only one file
  2. As Paul Mazak would say, the mantra is "less code characters", helps in long run.
  3. Annotations are cool ! Learn some new stuff
Well in the end it is a religious debate and fun as well. I will stick to hbm xml so far, playing with Annotations as I get an oppurtunity for new development.

Tuesday, June 30, 2009

PMP Exam

Passed my PMP exam today finally - what a ride it was.

It was tough, the real exam questions were very different from the mock exams I had been preparing with, in terms of the style, definitions used etc. There were a few new terms as well, that I never read of before.

Luckily the time was more than enough. I was able to run through all the 200 questions in 2 hours, 30 mins. For some of the questions I did take a lot of time to think as well. At the end I had around 25 questions marked for review and 4 not answered. The next 90 mins were enough to review and complete them all. I still had 23 mins remaining before I clicked "End Exam".

After I clicked "End Exam" I was asked for an optional survey. I wanted to fill the survey in good faith but who wants to wait 10 more mins to see a pass / fail score? They should have asked for the survey after showing the score.

Anyways, after the exam we went and watched a movie and had nice dinner at Chipotle. End of a saga and begining of a new one - whats next?

I want to take a bit of a break and then go for Sun Certified Java Web Services Developer or Sun Certified Enterprise Architect. Not sure yet which one to pick. And of course not to forget - keep an eye on those PDU's needed to keep PMP credential.

Caio

Thursday, June 11, 2009

No getters and setters

To design good software working with Domain language and making it part of Object's is very important. One way to get this, I think is to get away from the "get" and "set" polluted code.

consider this code:

public class Person {
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private String name;
}

We would end up using this code in its simplest form like this:
Person theOne = new Person();
theOne.setName("Neo Anderson");
System.out.println(theOne.getName());

Instead we can easily modify this code to make it more "domain driven"
public class Person {
public String name() {
return name;
}
public void nameIs(String name) {
this.name = name;
}
private String name;
}

Our new code would be:
Person theOne = new Person();
theOne.nameIs("Neo Anderson");
System.out.println(theOne.name());

you can tell this is more english like code as well. You can easily read line 2 in the code there as "The one's name is Neo Anderson". You can easily read line 3 as "Print the one's name"

I believe in this approach. The easiest way implement this approach is:
1. If you have a private variable names "varName", your getter method would be named "varName"
2. The setter method would be named "varNameIs" .... append with an Is

Wednesday, June 10, 2009

Eclipse: Run a single unit test method

In eclipse if we have a junit test class with several methods in it we can run a single method test. Select the method name, right click and run as junit test. The setup and teardown are run well also.

This technique, however, does not work with testng tests. Eclipse will run all the test methods.

Tuesday, June 9, 2009

TestNG and EasyMock

Unit Testing is pretty cool once you get a hang of it and have the right tools to play with it. I started using TestNG and EasyMock recently. TestNG has this neat feature that allows us to partition the tests as unit, integration etc. EasyMock is not as easy but not bad.

Some problems I faced with unit testing were that sometimes a single unit test would run fine when they run from eclipse, but when the suite is run on CI they would fail. Most of the times the problem was that a easymock object was created and reused in its stale state