Thursday, July 12, 2012


I'm familiar with ORM as a concept, and I've even used nHibernate several years ago for a .NET project; however, I haven't kept up with the topic of ORM in Java and haven't had a chance to use any of these tools.
But, now I may have the chance to begin to use some ORM tools for one of our applications, in an attempt to move away from a series of legacy web services.
I'm having a hard time telling the difference betweeen the JPA spec, what you get with the Hibernate library itself, and what JDO has to offer.
So, I understand that this question is a bit open-ended, but I was hoping to get some opinions on:
  • What are the pros and cons of each?
  • Which would you suggest for a new project?
  • Are there certain conditions when it would make sense to use one framework vs the other?
link|improve this question

feedback

10 Answers

up vote49down voteaccepted
Some notes:
  • JDO and JPA are both specifications, not implementations.
  • The idea is you can swap JPA implementations, if you restrict your code to use standard JPA only. (Ditto for JDO.)
  • Hibernate can be used as one such implementation of JPA.
  • However, Hibernate provides a native API, with features above and beyond that of JPA.
IMO, I would recommend Hibernate.

There have been some comments / questions about what you should do if you need to use Hibernate-specific features. There are many ways to look at this, but my advice would be:
  • If you are not worried by the prospect of vendor tie-in, then make your choice between Hibernate, and other JPA and JDO implementations including the various vendor specific extensions in your decision making.
  • If you are worried by the prospect of vendor tie-in, and you can't use JPA without resorting to vendor specific extensions, then don't use JPA. (Ditto for JDO).
In reality, you will probably need to trade-off how much you are worried by vendor tie-in versus how muchyou need those vendor specific extensions.
And there are other factors too, like how well you / your staff know the respective technologies, how much the products will cost in licensing, and whose story you believe about what is going to happen in the future for JDO and JPA.
link|improve this answer
5 
toolkit, nice and short. Another point worth mentioning is that JPA doesn't prevent from using implementation specific features if necessary. That means that JPA lets you use any Hibernate feature when Hibernate is an implementation. – topchef Mar 12 '10 at 4:11
1 
What would be the advantages of using JPA if I need some specific feature from Hibernate? – Bruno ReisMay 15 '10 at 14:53
10 
An important note that should be added: While JPA and JDO both have excellent support for RDBMSes JDO is 'datastore' agnostic and so is not limited to the RDBMS world. With the ground swell of NoSQL at the moment a person would be wise to consider using a persistence standard that avoids locking their apps to the traditional *SQL world. JDO applications can easily be deployed non RDBMS datastores. Full list of supported datastores can be found at: datanucleus.org/products/accessplatform/datastores.html – Volksman Aug 2 '10 at 21:16
1 
@Golfman why choose based on what might happen? There's nothing to stop you from rolling in something else later if you ever did end up needing NoSQL support... KISS – TM. Aug 9 '10 at 16:55
1 
@Bruno - when you are using non-Hibernate-specific parts of Hibernate, you are using JPA. Obviously, the advantage of restricting yourself to pure JPA is that you can switch to another JPA implementation more easily. – Stephen C Sep 19 '10 at 2:58
show 6 more comments
feedback
Make sure you evaluate the DataNucleus implementation of JDO. We started out with Hibernate because it appeared to be so popular but pretty soon realized that it's not a 100% transparent persistence solution. There are too many caveats and the documentation is full of 'if you have this situation then you must write your code like this' that took away the fun of freely modeling and coding however we want. JDO has never caused me to adjust my code or my model to get it to 'work properly'. I can just design and code simple POJOs as if I was going to use them 'in memory' only, yet I can persist them transparently.
The other advantage of JDO/DataNucleus over hibernate is that it doesn't have all the run time reflection overhead and is more memory efficient because it uses build time byte code enhancement (maybe add 1 sec to your build time for a large project) rather than hibernate's run time reflection powered proxy pattern.
Another thing you might find annoying with Hibernate is that a reference you have to what you think is the object... it's often a 'proxy' for the object. Without the benefit of byte code enhancement the proxy pattern is required to allow on demand loading (i.e. avoid pulling in your entire object graph when you pull in a top level object). Be prepared to override equals and hashcode because the object you think you're referencing is often just a proxy for that object.
Here's an example of frustrations you'll get with Hibernate that you won't get with JDO:
If you like coding to 'workarounds' then, sure, Hibernate is for you. If you appreciate clean, pure, object oriented, model driven development where you spend all your time on modeling, design and coding and none of it on ugly workarounds then spend a few hours evaluating JDO/DataNucleus. The hours invested will be repaid a thousand fold.
link|improve this answer
2 
And as we all know, enhancement is precisely why JDO has been so massively adopted! – Pascal ThiventMar 18 '10 at 21:57
9 
The well publicized FUD and astroturfing executed by key Hibernate players in the early days in relation to JDO is nothing short of dishonest and disgusting and no doubt had some affect on JDO's adoption. These days developers know that byte code enhancement is not a problem at all and often use it for many different purposes other than persistence. The new ASM byte code enhancement library is so lightning fast you don't even have time to take a breath before it's done. – Volksman Mar 19 '10 at 4:47
6 
The failure of JDO was predicted since the start (javalobby.org/forums/thread.jspa?forumID=46&threadID=1326) and before Hibernate so you can't blame Hibernate for that. Hibernate/Toplink succeeded where Sun and JDO players (and their OODBMS) failed because they were better answers at that time, not because of marketing and FUD. Period. Who cares if ASM is blazing fast today, it wasn't there 5+ years ago, when needed and JDO simply lost the battle. JDO is conceptually superior? Too bad, it failed at having a winner implementation on time (and won't come back because of JPA). – Pascal Thivent Mar 19 '10 at 9:56
1 
To illustrate my words (yet another post that illustrates the pain that people were feeling during development or why Hibernate did win the battle): mail-archive.com/open-jpa-dev@incubator.apache.org/…. It seems obvious to me that reflection/cglib was a practical answer to people's problems (and people don't care if an API is conceptually superior if it's a pain to use) and I don't see any Hibernate key players here, just users. So at the end I wonder who is spreading FUD actually... – Pascal Thivent Mar 19 '10 at 12:34
7 
Well this is certainly not like the old days where there would have been at least 17 different pro Hibernate FUD posts (yet only coming from 3 different IP addresses. Do the maths people =) ). – Volksman Mar 24 '10 at 2:44
show 4 more comments
feedback
Which would you suggest for a new project?
I would suggest neither! Use Spring DAO's JdbcTemplate together with StoredProcedure,RowMapper and RowCallbackHandler instead.
My own personal experience with Hibernate is that the time saved up-front is more than offset by the endless days you will spend down the line trying to understand and debug issues like unexpected cascading update behaviour.
If you are using a relational DB then the closer your code is to it, the more control you have. Spring's DAO layer allows fine control of the mapping layer, whilst removing the need for boilerplate code. Also, it integrates into Spring's transaction layer which means you can very easily add (via AOP) complicated transactional behaviour without this intruding into your code (of course, you get this with Hibernate too).
link|improve this answer
2 
this is clearly anti- object-relational mapping (ORM) choice driven by large user and code base accumulated since ODBC times (early 90s) (read legacy). There is no reason not to use JDBC (with or without Spring) unless you choose to move on and use ORM framework. Think of those people who one day decided to ditch FORTRAN to use C or Pascal. – topchef Mar 10 '10 at 6:34
12 
@grigory - I speak with much experience of wasting days trying to understand Hibernate issues, such as cascading updates/deletes, ridiculously inefficient query structures etc. ORM solutions are a "quick-win" for those with insufficient understanding of relational databases. As such, it is unlikely that knowledge of Hibernate alone will result in a good end-product. It's my experience that, over the project lifecycle, Hibernate (and ORM by extension) costs more time than it saves – oxbow_lakes Jun 4 '10 at 8:13
7 
sorry that you had such poor experience with Hibernate. I am coming from heavy database/SQL/stored procedure/JDBC school myself. I can't say I am convert - every technology above still has a place to be. But for general purpose Java 3-tier application (no matter what size) first choice is an ORM technology - preferably JPA 2. Others are to be considered based on such factors legacy code, integration, expertise, batch-heavy requirements, real-time performance etc. which may steer (or may not) approach towards different database technology stack. – topchef Jun 4 '10 at 16:04
2 
I completely disagree with "quick-win" definition above - just grab Hibernate in Action (stackoverflow.com/questions/96729/…) (and it's JPA 1, with JPA 2 it gets only better) to fully understand power and coverage this technology has. – topchef Jun 4 '10 at 16:05
4 
I did a little research and Spring no longer recommends Spring DAO's (static.springsource.org/spring/docs/3.0.x/…): "The recommended integration style is to code DAOs against plain Hibernate, JPA, and JDO APIs. The older style of using Spring's DAO templates is no longer recommended;"...Is this what you were recommending? If so, why do they not recommend it? – User1 Jan 25 '11 at 18:40
show 6 more comments
feedback
JDO is dead
JDO is not dead actually so please check your facts. JDO 2.2 was released in Oct 2008 JDO 2.3 is under development.
This is developed openly, under Apache. More releases than JPA has had, and its ORM specification is still in advance of even the JPA2 proposed features
link|improve this answer
6 
People are most certainly using it, as evidenced by the many users that DataNucleus has, never mind Xcalia, Kodo. You miss the basic idea that JDO and JPA are not filling the same market. JPA is exclusively RDBMS. JDO is datastore agnostic and is used for RDBMS, but also LDAP, XML, Excel, OODBMs etc – DataNucleus Feb 22 '09 at 9:19
2 
I like the non-RDBMS factor, particularly with the increase in popularity of non-RDBMS solutions, it's a big deal. This means that if JPA doesn't evolve fast enough, availability of a "more open" and flexible alternative (JDO) means that JPA's popularity will be trending downwards, out of necessity. Never mind the technical arguments that JDO is more complete, superior, mature, or whatever else--it won't be a matter of preference. It makes sense that RDBMS vendors are behaving suspiciously--the days of RDBMS market dominance may be coming to an end. – Crusader Feb 27 '11 at 22:24
feedback
I have recently evaluated and picked a persistence framework for a java project and my findings are as follows:
What I am seeing is that the support in favour of JDO is primarily:
  • you can use non-sql datasources, db4o, hbase, ldap, bigtable, couchdb (plugins for cassandra) etc.
  • you can easily switch from an sql to non-sql datasource and vice-versa.
  • no proxy objects and therefore less pain with regards to hashcode() and equals() implementations
  • more POJO and hence less workarounds required
  • supports more relationship and field types
and the support in favour of JPA is primarily:
  • more popular
  • jdo is dead
  • doesnt use bytecode enhancement
I am seeing a lot of pro-JPA posts from JPA developers who have clearly not used JDO/Datanucleus offering weak arguments for not using JDO.
I am also seeing a lot of posts from JDO users who have migrated to JDO and are much happier as a result.
In respect of JPA being more popular, it seems that this is due in part due to RDBMS vendor support rather than it being technically superior. (Sounds like VHS/Betamax to me).
JDO and it's reference implementation Datanucleus is clearly not dead, as shown by Google's adoption of it for GAE and active development on the source-code (http://sourceforge.net/projects/datanucleus/).
I have seen a number of complaints about JDO due to bytecode enhancement, but no explanation yet for why it is bad.
In fact, in a world that is becoming more and more obsessed by NoSQL solutions, JDO (and the datanucleus implementation) seems a much safer bet.
I have just started using JDO/Datanucleus and have it set up so that I can switch easily between using db4o and mysql. It's helpful for rapid development to use db4o and not have to worry too much about the DB schema and then, once the schema is stabilised to deploy to a database. I also feel confident that later on, I could deploy all/part of my application to GAE or take advantage of distributed storage/map-reduce a la hbase /hadoop / cassandra without too much refactoring.
I found the initial hurdle of getting started with Datanucleus a little tricky - The documentation on the datanucleus website is a little hard to get into - the tutorials are not as easily to follow as I would have liked. Having said that, the more detailed documentation on the API and mapping is very good once you get past the initial learning curve.
The answer is, it depends what you want. I would rather have cleaner code, no-vendor-lock-in, more pojo-orientated, nosql options verses more-popular.
If you want the warm fussy feeling that you are doing the same as the majority of other developers/sheep, choose JPA/hibernate. If you want to lead in your field, test drive JDO/Datanucleus and make your own mind up.
link|improve this answer
5 
Actually, just like I said, I was just giving my impressions of what I had discovered while trying to pick a solution. Yes I am a beginner in Java, why should that be that relavent? You, on the other hand have posted a number of times stating your opinion that JDO is dead without offering any facts or proof to substantiate it and not acknowledging the technical areas where JDO is clearly superior. You obviously have something personal against JDO/Datanucleus and are using these threads as a means to perpetuate your anti-JDO stance. – Tom Oct 3 '10 at 16:12
3 
Pascal - you are arguing yourself into a corner here. I think you are missing the point of the Advertising section of the FAQ. The OP asked for opinions about 2 technologies. It is inviting those supporting either side to come forward and present their constructive criticisms/recommendations. For Andy/Datanucleus and other JDO users to highlight JDO positives and defend against criticisms is no more advertising than someone else here recommending to use hibernate. – Tom Oct 5 '10 at 11:01
3 
You might do well to refer to the section of the FAQ that says 'Be Nice' for your posts on this topic have been accusatorial, confrontational or plain rude. Your first was a sarcastic comment about enhancement. Second; a rant on the difficulties of early implementations and is no longer relevant. Third was a childish mocking and insult to those who might prefer not to use RDBMS. Fourth was sarcastic mocking of someone who has different views to you. Fifth was an attack; calling me a parrot. Do you consider this 'Being nice'? – Tom Oct 5 '10 at 11:01
2 
If you had a horrible experience with JDO, then explain what was horrible, acknowledge that it was with an earlier version and things may have been improved since then. You need to also recognise that others may have different needs to you. Just because you are 'satisfied' with JPA and want to use a RDBMS doesn’t mean that others are. Maybe in your haste to increase your reputation you have lost sight of what that reputation is there to award? ps. As a developer you should really be interested in the wellbeing of such projects as that is what drives innovation and reduces vendor-lock in. – Tom Oct 5 '10 at 11:01
4 
This will be my final response :) .. 1. If it wasn't relavent to question why raise it? 2. I never questioned your honesty, I said you were not being nice to other posters and that you contradicted yourself. 3. no one suggested you summarize 8+ years - but back up your statements with facts and examples rather than subjective statements that are likely to offend. 5. Where are the 'hibernate/jpa/jboss is evil' attitude on this post? I dont see it. I only see your anti-JDO comments. – Tom Oct 8 '10 at 19:26
show 8 more comments
feedback
JDO is having advanced features than JPA see http://db.apache.org/jdo/jdo_v_jpa.html
link|improve this answer
feedback
I am using JPA (OpenJPA implementation from Apache which is based on the KODO JDO codebase which is 5+ years old and extremely fast/reliable). IMHO anyone who tells you to bypass the specs is giving you bad advice. I put the time in and was definitely rewarded. With either JDO or JPA you can change vendors with minimal changes (JPA has orm mapping so we are talking less than a day to possibly change vendors). If you have 100+ tables like I do this is huge. Plus you get built0in caching with cluster-wise cache evictions and its all good. SQL/Jdbc is fine for high performance queries but transparent persistence is far superior for writing your algorithms and data input routines. I only have about 16 SQL queries in my whole system (50k+ lines of code).
link|improve this answer
feedback
Anyone who says that JDO is dead is an astroturfing FUD monger and they know it.
JDO is alive and well. The specification is still more powerful, mature and advanced than the much younger and constrained JPA.
If you want to limit yourself to only what's available in the JPA standard you can write to JPA and use DataNucleus as a high performance, more transparent persistence implementation than the other implementations of JPA. Of course DataNucleus also implements the JDO standard if you want the flexibility and efficiency of modeling that JDO brings.