Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Does Hibernate have to drive database design?

Tags:

java

hibernate

I spent all of yesterday reading various articles/tutorials on Hibernate and although I am blown-away by how powerful it is, I have one major concern with it.

It seems that the standard practice is to allow Hibernate to design/generate your DB schema for you, which is a new and scary concept that I am choking on. From the tutorials I read, you just add a new entity to your hibernate.cfg.xml config file, annotate any POJO you want with @Entity, and voila - Hibernate creates the tables for you. Although this is very cool, it has me wondering about a handful of scenarios:

  • What if you already have a DB schema and the one Hibernate wants to generate for you does not conform to it? What if you have a crazy DBA that refuses to budge on the pre-defined (non-Hibernate) schema?
  • What if you have reference tables with tens of thousands of records in it (like all the cities in the world)? Would you have to instantiate and save() tens of thousands of unique POJOs or is there a way to configure Hibernate so it will honor and not overwrite data already existing in your tables?
  • What if you want to do perf tuning on your schema/tables? This includes indexing, normalizing above and beyond what Hibernate creates automatically?
  • What if you want to add constraints or triggers to your tables? Indexes?

I guess at the root of this is the following:

It looks like Hibernate creates and forces a particular schema/config on your DB. I am wondering how this agenda will conflict with our platform standards, our DBA philosophies, and our ability to perf tune/tweak tables that Hibernate interacts with.

Thanks in advance.

like image 660
IAmYourFaja Avatar asked Jun 21 '12 16:06

IAmYourFaja


2 Answers

I think you're attributing too much power to Hibernate.

Hibernate does have an idiom that may influence database implementation.

Hibernate does not generate a schema for you unless you ask it to do so. It's possible to start with an existing schema and map it to Java objects using Hibernate. But it might not be possible or optimal if the schema conflicts with Hibernate requirements.

If the DBA won't budge - as they shouldn't - or Hibernate can't accomodate you, then you have your answer: you can't use Hibernate.

Your DBA might consent, but your app might find that the dynamic SQL that's generated for you by Hibernate isn't what you want.

Fortunately for you, it's not the only game in town.

I don't think implementations have to be all or none. If you use simple JDBC to access reference data, what's the harm?

Database design considerations should be independent of Hibernate. Constraints, triggers, normalization, and indexes should be driven by business needs, not your middleware choices.

If you don't have a solid object model, or the schema can't accomodate it, then you should reconsider Hibernate. There's straight JDBC, stored procedures, Spring JDBC, and iBatis as alternatives.

like image 127
duffymo Avatar answered Sep 21 '22 03:09

duffymo


Hibernate comes with a default way to map objects to tables - like several tools/libraries, it favours convention over configuration for simplicity.

However, if you want to map the entities to database tables differently, you can explicitly tell Hibernate how these are mapped (from simple attributes such as changing the table name, through to redefining the foreign-key relationships between related entities and how this is persisted).

If you do this correctly, you don't need to instantiate and save existing data, as this would be pointless - the database already contains the information about the entities in exactly the form that Hibernate understands. (Think about it - to load and then immediately save an entity should always be a no-op, and so can be skipped altogether.)

So the short answer to your question is "no". If you don't care for designing tables, you can let Hibernate adopt a reasonable default. If you do want to design your schema explicitly though, you can do this and then describe that exact schema to Hibernate.

like image 26
Andrzej Doyle Avatar answered Sep 21 '22 03:09

Andrzej Doyle