OK, so this is probably another Hibernate issue, but still. I'm building my Seam app from the Seam Hibernate example under Tomcat alone (microcontainer, yada yada). I'm trying to declare a @PreUpdate method to protect certain objects from updates (by throwing an exception and killing the session). But my method is never called.
Code: @Entity | @Inheritance(strategy=InheritanceType.JOINED) | public class RepObject { | ... | private Changeset replicatedChangeset; | | /** | * The changeset in which this object was created. Null for head objects; set for all | * versioned copies. | */ | @ManyToOne | public Changeset getReplicatedChangeset () | { | return replicatedChangeset; | } | ... | @PreUpdate | private void checkUpdate () { | log.debug("Calling checkUpdate on " + this + "..."); | if (replicatedChangeset != null) { | throw new IllegalStateException("Can't update snapshotted object " + this); | } | } The idea is that a RepObject can be copied, and the copy has a non-null "Changeset". The copy then should never ever be updated again. Basically I want it to be "dynamically immutable" (I wish there was a way to flag a particular object as immutable at the Hibernate level, but the best I can do is blow up if you change it and then try to flush). The test is this. (BlogPostImpl is of course a subclass of RepObject.) database.enableFilter("priorVersion").setParameter("version", last.getId()); | List<BlogPostImpl> priorBlogPosts = database.createQuery("from BlogPostImpl").list(); | | try { | BlogPost prior1 = priorBlogPosts.get(0); | prior1.setTitle("changedTitle"); | | // this should call the @PreUpdate on RepObject, which should blow up here | // ... but doesn't! and I can't even see where the @PreUpdate gets read! | database.flush(); | | // assert false; // plan to die if we get this far; should get exception from the flush | } catch (Exception e) { | // you should never do this, so we don't attempt to support any sort of recovery! | log.info("Got expected exception from attempted snapshot update", e); | } But my @PreUpdate method is never called, no exception gets thrown, and I hit the "assert false". And I can see in the log output that the flush *is* causing a single update: DEBUG 06-07 08:49:12,353 (Log4JLogger.java:debug:84) -Flushed: 0 insertions, 1 updates, 0 deletions to 4 objects | ... DEBUG 06-07 08:49:12,393 (Log4JLogger.java:debug:84) -update RepObject set version=?, replicatedChangeset_id=?, replicatedKey=? where id=? and version=? | ... DEBUG 06-07 08:49:12,433 (Log4JLogger.java:debug:84) -update BlogPostImpl set content=?, title=? where repobject_id=? In digging through hibernate-annotations source, I can't see where AnnotationBinder ever looks at the Entity methods to see which of them are flagged with EJB3 callbacks! I would like to trace through the code that sets up the callbacks on this Entity, but I can't find it to trace through! What am I missing? Can anyone confirm or disconfirm that EJB3 persistence lifecycle annotations actually work with Seam @Entities? I will also post this in the Hibernate EJB3 forum.... Cheers, Rob View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3955971#3955971 Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3955971 Using Tomcat but need to do more? Need to support web services, security? Get stuff done quickly with pre-integrated technology to make your job easier Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642 _______________________________________________ JBoss-user mailing list JBoss-user@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jboss-user