In general, when you implement an event listener, you're supposed to be careful 
to avoid triggering the event again.

So, yes, your use-case is tricky to implement, but it's sufficiently rare that 
it's not worth complicating the Trigger
API for it.

Christian Bauer wrote:
> On Nov 29, 2011, at 18:28 , Noel Grandin wrote:
>
>> Implement the Trigger interface and check the oldRow vs newRow
>> parameters to see which fields have changed.
> This is the workaround:
>
> public class UpdateLastModifiedTrigger extends TriggerAdapter {
>
>     public static final String COLUMN_ID = "ID";
>     public static final String COLUMN_LASTMODIFIED = "LASTMODIFIED";
>
>     protected String tableName;
>
>     @Override
>     public void init(Connection conn, String schemaName, String triggerName, 
> String tableName, boolean before, int type) throws SQLException {
>         super.init(conn, schemaName, triggerName, tableName, before, type);
>         this.tableName = tableName;
>     }
>
>     @Override
>     public void fire(Connection conn, ResultSet oldRow, ResultSet newRow) 
> throws SQLException {
>         if (newRow == null ) return; // This is a DELETE
>
>         if (oldRow != null) {
>             // This is an UPDATE
>             // Yes, our UPDATE statement below will fire this trigger again, 
> filter that!
>             Timestamp oldTimestamp = oldRow.getTimestamp(COLUMN_LASTMODIFIED);
>             Timestamp newTimestamp = newRow.getTimestamp(COLUMN_LASTMODIFIED);
>             if (oldTimestamp == null)
>                 return;
>             if (oldTimestamp.getTime() != newTimestamp.getTime())
>                 return;
>         }
>
>         PreparedStatement statement = conn.prepareStatement(
>                 "update " + tableName +
>                         " set " + COLUMN_LASTMODIFIED + " = 
> current_timestamp()" +
>                         " where " + COLUMN_ID + " = ?"
>         );
>         // This assumes the PK column is named "ID"
>         Long id = newRow.getLong(COLUMN_ID);
>         statement.setLong(1, id);
>         statement.execute();
>     }
> }
>
> It would be so much nicer if I could return false from init(), indicating 
> that I don't want this trigger running more than once in the current command. 
> You know, the same as component.setValue(dontFireEvents) in the Swing API or 
> really any other event/listener API I can think of.
>

-- 
You received this message because you are subscribed to the Google Groups "H2 
Database" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/h2-database?hl=en.

Reply via email to