当前位置: 动力学知识库 > 问答 > 编程问答 >

java - Interacting with the hibernate Session during event calls

问题描述:

I want to write a history component that tracks changes to a particular object type and writes history rows based on the difference. Note this is not a general audit system it is specific for one object type.

I figure I can hook into the hibernate event model and listen for events that tells me when things have changed, watch for any changes to instances of the object type I am interested in, and then have some custom code generate the history rows.

I want the history rows written in the same transaction, and ideally using hibernate (therefore using the same Session)

I have some questions/concerns

  • Which hibernate events should I hook, assuming I want to trap just changes?
  • How do I go about participate in the same Session/transaction as the Session that are generating the events. I have read there are issues interacting with the Session inside event handlers?

Any help appreciated.

网友答案:

There is a generic audit solution for hibernate entities, called envers, that should do the trick.

However, if this solution is not enough (as your comment suggests), the org.hibernate.events package defines the usable events. In you case, I would suggest to implement at least the PostUpdateEventListener interface.

网友答案:

The pre-insert and pre-update events seem a good choice.

Your PrePersistEvent and PreUpdateEvent have a getSession() method which is:

the session event source for this event. This is the underlying session from which this event was generated.

So, using it, you can create new objects and persist them within the same session and transaction.

网友答案:

When using the these events make sure that you do not touch the session that caused the events to fire. Get the session and retrieve the session factory and open a new session. This will still be in the same transaction, but you will avoid a lot of Hibernate problems.

Also, if you start traversing object graphs on the object that caused the event to fire, then you can get strange errors as you have changed collection states during a flush. There are Jira tickets open for this "bug".

分享给朋友:
您可能感兴趣的文章:
随机阅读: