Search |
||
A Generic CRUD Facade for your @Entity BeansPosted by felipegaucho on April 19, 2009 at 3:54 PM PDT
CRUD (create-read-update-delete) is a repetitive code in Java EE projects but it can be isolated in a unique class through the usage of JPA annotations and Generics - a class I call CRUDEntityFacade. This is not a new pattern and the goal of this blog entry is just to prepare you to read my next entries about JAXB and JPA together. I am doing really nice things with Jersey and Glassfish, and before exposing complicated inventions I decided to register the basics of the persistence layer (also very nice for my own future reference). Complete sample projectsThe code I am publishing here is just to avoid you to checkout a full project and to dig to inspect my CRUD strategy. But if you want to see this technique in action, please be my guest to checkout one of my open-source projects. The projects are built by Maven and were created in Eclipse - but you should be able to run it on your preferred IDE without any problems. Both projects require minimum Java 6.
The generic CRUD implemented with generics and JPA annotations
In my next entries I will show you how to use dual annotation (JAXB + JPA) in order to minimize the impedance mismatch between the persistence layer and the serialization of element used in the services endpoints - REST or SOAP. »
Related Topics >>
Patterns Comments
Comments are listed in date ascending order (oldest first)
Submitted by ljnelson on Sun, 2009-04-19 16:53.
Ooh, be careful with the update: merge(T) returns a T, which you are going to want to use to avoid exceptions later on.
Cheers,
Laird
Submitted by agoncal on Sun, 2009-04-19 23:50.
Hi Felipe,
For me the DAO pattern shouldn't be used for CRUD anymore (except if it's complex ones or if there is a real reason to change database). As Adam wrote on his blog (http://www.adam-bien.com/roller/abien/entry/jpa_ejb3_killed_the_dao) the EntityManager acts like a abstract DAO. One line of code and you can persist an entity.
Antonio
Submitted by felipegaucho on Mon, 2009-04-20 00:26.
Antonio: yes, the entity manager may be adopted but we usually don't have only CRUD in our applications. So, one of the goals of my DAO is to centralize the interface, I can know what persistence operation is being done in a unique package.
The point is about the robustness and reuse of the code. Creating a centralized persistence code, I can test and verify it is correct once and only once in my project. Spreading the injection of the entity manager all over the code force me to verify every point where I am using the persistence about it correctness. And I have the custom operations also, what will force a second code somewhere.. I prefer to declare this code in a sub-interface then to keep it hidden in a particular type.
Submitted by felipegaucho on Mon, 2009-04-20 00:26.
Laird,
thanks.. I missed this detail... I will fix the code here :)
Submitted by mrmorris on Mon, 2009-04-20 00:34.
Great. So now we just need a UI generater on top, say GWT. ;)
Submitted by felipegaucho on Mon, 2009-04-20 00:51.
Morris: in my current code I already double annotate the entities as JAXB serializable elements, so I can expose the entities directly on the service endpoint ... in a future Java version we can dream with "GUI Annotations", so we can annotate our entities with a something like @GUI(format="masterdetail", role="master"). This will expose an interface used by the GUI renderers (like GWT or JavaFX) to produce the graphical user interface.. nice, isn't it ? :)
Submitted by javaniraj on Wed, 2009-04-22 07:10.
The Jmatter framework http://jmatter.org/ also uses annotations(@entity) to produce full blown UI in swing and also it has some nice proff of concept to produce UI in Wings and ECHO2.
Submitted by kschaefe on Wed, 2009-04-22 20:01.
You can avoid having a subclass per DAO if you vend the DAOs from a factory.
public static DAO createDAO(Class entityClass);
Then, you can pass the Class reference in, instead of magicking it from the subclasses generic type arguments.
Karl
|
||
|
|