views:

36

answers:

3

Hello everybody

I have some type an architect(?) question

I develop an application, based on Spring and Hibernate (annotated configuration) For each table in my database I added 4 fields: createdBy and modifiedBy(String), created and modified (Datetime). Respectively each entity class also has this fields and getter/setter pairs. So I want to find best practice solution for filling this fields instead adding for each DAO extra code. Is it possible?

I'll be glad to any proposal

A: 

Look at Spring AOP. You can assign an "interceptor" for your DAO methods, so that the objects are first handled by the interceptor, and then the execution proceeds to the DAO methods.
In the interceptor you can fill the objects with the data you need.

Bozho
+3  A: 

Certainly. Just add this code to a base class for all your persistent instances and enable annotation processing:

@PrePersist
public void prePersist()
{
    if (created == null)
    {
        created = updated = createCurrentTimestamp();
        createdBy = updatedBy = CurrentUser.get();
    }
}

@PreUpdate
public void preUpdate()
{
    updated = createCurrentTimestamp();
    updatedBy = CurrentUser.get();
}

public static java.sql.Timestamp createCurrentTimestamp ()
{
    final long now = System.currentTimeMillis();
    final java.sql.Timestamp ts = new java.sql.Timestamp (now);
    ts.setNanos(((int)(now % 1000)) * 1000000);
    return ts;
}

CurrentUser is a ThreadLocal<String> which allows me to specify at the start of an operation which user started it. This way, any object that gets touched will contain the correct information.

Without annotation processing, activate the respective options in your HBM file.

Aaron Digulla
A: 

One possibility would be to define a Hibernate EventListener which can fill in these fields just before each entity is flushed to the database

alasdairg