views:

38

answers:

1

Using Hibernate 3.5.1 and MSSQL 2008

Hi trying to implement the typical DateCreated and DateModified columns. The issue I have is that the time must be set from the DB not the application.

For DateCreated I can set the property to generated = always and set a default constraint (yes that reads right damn MS) on MS SQL 2008 to a default value of GetDate()

How would I go about it for DateModified?

+1  A: 

For DateCreated I can set the property to generated = always and set a default constraint (yes that reads right damn MS) on MS SQL 2008 to a default value of GetDate()

Well, you should actually use generated = insert for the creation date, it is not supposed to change upon subsequent updates and this will save an additional select for this column during updates.

How would I go about it for DateModified?

And this is where you should use generated = always (and a trigger on the database side).

Here is what the reference documentation writes about them:

5.6. Generated properties

Generated properties are properties that have their values generated by the database. Typically, Hibernate applications needed to refresh objects that contain any properties for which the database was generating values. Marking properties as generated, however, lets the application delegate this responsibility to Hibernate. When Hibernate issues an SQL INSERT or UPDATE for an entity that has defined generated properties, it immediately issues a select afterwards to retrieve the generated values.

Properties marked as generated must additionally be non-insertable and non-updateable. Only versions, timestamps, and simple properties, can be marked as generated.

  • never: (the default): the given property value is not generated within the database.

  • insert: the given property value is generated on insert, but is not regenerated on subsequent updates. Properties like created-date fall into this category. Even though version and timestamp properties can be marked as generated, this option is not available.

  • always: the property value is generated both on insert and on update.

Pascal Thivent
Triggers are the devil in MSSQL so there has to be another way? Maybe a formula on the column?
@user432024 I don't know why triggers are particularly evil with MSSQL but... `The issue I have is that the time must be set from the DB not the application` I don't know how to do that without a trigger for the `DateModified` *if* you want to do it on the database side.
Pascal Thivent
How about? formula="arbitrary SQL expression" http://docs.jboss.org/hibernate/core/3.3/reference/en/html/mapping.html#mapping-declaration-property or timestamp properties?
@user432024 Formula properties are not persisted AFAIK.
Pascal Thivent
I'm thinking of using custom sql. Fortunately the dates are only required for admin auditing so I technically don't need to bring back the generated value to the app.