Home > Application Development, J2EE > Hibernate Question – how to work with history

Hibernate Question – how to work with history

August 4th, 2005

I have a small hibernate question that I can not seem to find an answer to, however, this may be due to my not knowing how to search for it properly.

The question is: how to work with objects in Java that, in the database, must preserve history? A lot of database schemas, instead of updating rows, do a new insert and mark the new row as active in some way. This allows an organization to basically version their data and ensures that they never loose or delete anything.

Below is a common schema for capturing history. You have a central table, Person, that contains only the fields that are unlikely to change. In this example, I am assuming that most people do not change their names. Off of that central table, are tables that hold all the other data related to the central table. In this case, the two other tables hold a person’s address and phone number. As this data changes, the records in the respective table are not updated. Instead, another row is added to the table and it becomes the active record. Below is a diagram showing the database schema.

Diagram showing common schema to handle record history in a database

Just to make this completely clear, below shows the data in the three tables as they would exist after a few updates.

Person
personID | firstname | lastname
---------|-----------|----------
  1      | mickey    | mouse

Address
addressID | street             | Person_personID
----------|--------------------|----------------
  1       | 112 somewhere str. |  1
  2       | 20 elsewhere ave.  |  1

Phone
phoneID | phone_number | Person_personID
--------|--------------|----------------
  1     | 555-555-1234 |  1
  2     | 555-555-4321 |  1
  3     | 555-444 4444 |  1

So, here is the question. In Java, I would create the following class diagram:

Class diagram of History hibernate question

The problem is that if I modify any of the associated objects, Hibernate will simply go in and update the associated rows in the database. So, is there any way to force Hibernate to insert a new row instead of updating the existing row?

Categories: Application Development, J2EE Tags:
Comments are closed.