Hi Jim
> Are you able to query the audited entities using the AuditReader?
Yes, I can create queries using AuditReader.
Two questions:
1) Are you using current_session_context_class = thread ?
<property name="current_session_context_class">thread</property>
2) Are you using the "real" Hibernate Session.
http://www.mail-archive.com/[email protected]/msg37227.html
Here is my code (the relevant part)
@Inject
private HibernateSessionManager sessionManager;
.....
AuditReader reader = AuditReaderFactory.get(sessionManager.getSession());
AuditQuery query =
reader.createQuery().forRevisionsOfEntity(getClassDescriptor().getType(),
false, true);
query.add(AuditEntity.id().eq(getBeanId()));
Saludos.
Alejandro.
On Sun, Dec 20, 2009 at 2:59 PM, Jim O'Callaghan <[email protected]> wrote:
> Howard, Alejandro,
>
> Thanks for looking at the problem.
>
> Alejandro,
>
> Thanks for the detailed source.
>
> I had made local (less elegant!) changes that I think have the same net
> effect as the changes you have outlined below:
>
> - locally modified org.apache.tapestry5.hibernate.HibernateModule.java to
> not contribute a ValueEncoder for a persistentClass if the class has no
> MappedClass (I was using .hasPojoRepresentation to decide as I wasn't sure
> that the lack of a MappedClass should be correctly flagged as an error
> situation under certain circumstances)
>
> - added a section as follows to the existing
> contributeHibernateSessionSource method within my AppModule:
>
> AuditEventListener[] auditEventListener = new
> AuditEventListener[] {new AuditEventListener()};
>
> configuration.getEventListeners().setPostInsertEventListeners(auditEventListener);
>
> configuration.getEventListeners().setPostUpdateEventListeners(auditEventListener);
>
> configuration.getEventListeners().setPostDeleteEventListeners(auditEventListener);
>
> configuration.getEventListeners().setPreCollectionUpdateEventListeners(auditEventListener);
>
> configuration.getEventListeners().setPreCollectionRemoveEventListeners(auditEventListener);
>
> configuration.getEventListeners().setPostCollectionRecreateEventListeners(auditEventListener);
>
> The type of AuditEventListener above is definitely
> org.hibernate.envers.event.AuditEventListener. My entities are being audited
> correctly upon save / update - the problem is when I use
> org.hibernate.envers.AuditReaderFactory / AuditReader to create a query to
> return some of the audited entities - this is where the "xyz_AUD is not
> mapped" issue occurs. Are you able to query the audited entities using the
> AuditReader? If you are then perhaps I have some other settings incorrect -
> I also tried taking out my changes and replacing them with yours, in case
> there was some subtle difference I was missing, but got the same result.
> Thanks.
>
> Regards,
> Jim.
>
> -----Original Message-----
> From: Alejandro Scandroli [mailto:[email protected]]
> Sent: 19 December 2009 20:05
> To: Tapestry users
> Subject: Re: Tapestry5 and envers (2)
>
>
> Here is how I worked around this problem:
>
> First in your AppModule prevent Hibernate from contributing the
> ValueEncoderSource with this:
>
> public static void
> contributeFactoryDefaults(MappedConfiguration<String, String>
> configuration)
> {
> configuration.override(HibernateSymbols.PROVIDE_ENTITY_VALUE_ENCODERS,
> "false");
> }
>
> Then implement your own contributeValueEncoderSource skipping the
> ValueEncoder creation if entityClass is null
>
> @SuppressWarnings("unchecked")
> public static void
> contributeValueEncoderSource(MappedConfiguration<Class,
> ValueEncoderFactory> configuration,
> final
> HibernateSessionSource sessionSource,
> final Session session,
> final TypeCoercer typeCoercer,
> final PropertyAccess
> propertyAccess,
> final LoggerSource
> loggerSource)
> {
>
> org.hibernate.cfg.Configuration config = sessionSource.getConfiguration();
> Iterator<PersistentClass> mappings = config.getClassMappings();
> while (mappings.hasNext())
> {
> final PersistentClass persistentClass = mappings.next();
> final Class entityClass = persistentClass.getMappedClass();
>
> if (entityClass != null)
> {
> ValueEncoderFactory factory = new ValueEncoderFactory()
> {
> public ValueEncoder create(Class type)
> {
> return new
> HibernateEntityValueEncoder(entityClass, persistentClass, session,
> propertyAccess,
> typeCoercer, loggerSource.getLogger(entityClass));
> }
> };
>
> configuration.add(entityClass, factory);
> }
> }
> }
>
>
> That's it.
>
> Now that I know it's not just me, I will file a JIRA issue for adding
> the check "if (entityClass != null)" to the main tapestry-hibernate
> module.
>
> Bonus track:
>
> I also use an HibernateConfigurer for adding the Listeners
>
> public class EnversHibernateConfigurer implements HibernateConfigurer
> {
>
> public EnversHibernateConfigurer() {}
>
> public void configure(Configuration configuration)
> {
> configuration.setListener("post-insert",
> "org.hibernate.envers.event.AuditEventListener");
> configuration.setListener("post-update",
> "org.hibernate.envers.event.AuditEventListener");
> configuration.setListener("post-delete",
> "org.hibernate.envers.event.AuditEventListener");
> configuration.setListener("pre-collection-update",
> "org.hibernate.envers.event.AuditEventListener");
> configuration.setListener("pre-collection-remove",
> "org.hibernate.envers.event.AuditEventListener");
> configuration.setListener("post-collection-recreate",
> "org.hibernate.envers.event.AuditEventListener");
> }
> }
>
>
> I planned to release this code to open source in January, but if you
> are willing to try untested code I can check it in sooner.
>
> I hope it helps.
>
> Saludos.
> Alejandro Scandroli.
>
> On Sat, Dec 19, 2009 at 1:32 AM, Howard Lewis Ship <[email protected]> wrote:
>> I'm afraid I'm not familiar enough with envers to help ... I haven't
>> heard of it before.
>>
>> On Fri, Dec 18, 2009 at 4:21 PM, Jim O'Callaghan <[email protected]>
>> wrote:
>>> Still stumped on this - any pointers on where to look or Tapestry5 relevant
>>> examples would be really helpful.
>>>
>>> Relevant envers listeners are configured and are working correctly when
>>> entities are created / updated. Tapestry (specifically the hibernate
>>> session) does not appear to see the generated xyz_AUD entities and
>>> complains that these entities are not mapped with an error ex.:
>>>
>>> Caused by: org.hibernate.hql.ast.QuerySyntaxException:
>>> com.abc.xyz.entities.core.user.User_AUD is not mapped [select e, r from ...
>>>
>>> ... whenever any AuditReader methods are called.
>>>
>>> Within method contributeValueEncoderSource in HibernateModule.java,
>>> persistentClass.getMappedClass() returns null for the *_AUD classes,
>>> resulting in an error adding the entity to the configuration (blank key).
>>> I tried testing classForName on the *_AUD entities where
>>> .hasPojoRepresentation returns false but get class not found exception.
>>>
>>> Towards the end of startup output I do see the entities I expect configured:
>>>
>>> [INFO] HibernateCoreModule.HibernateSessionSource Configured Hibernate
>>> entities: Client_Address_AUD, Client_Phone_AUD,
>>> com.abc.xyz.entities.core.SystemKey,
>>> com.abc.xyz.entities.core.client.Address,
>>> com.abc.xyz.entities.core.client.Address_AUD,
>>> com.abc.xyz.entities.core.client.Client,
>>> com.abc.xyz.entities.core.client.Client_AUD,
>>> com.abc.xyz.entities.core.client.Phone,
>>> com.abc.xyz.entities.core.client.Phone_AUD,
>>> com.abc.xyz.entities.core.user.Role, com.abc.xyz.entities.core.user.User,
>>> com.abc.xyz.entities.core.user.UserClass, com.abc.xyz.entities.menu.Menu,
>>> com.abc.xyz.entities.menu.MenuEntry,
>>> org.hibernate.envers.DefaultRevisionEntity
>>>
>>> The earlier startup output does differ between the concrete entities and
>>> the envers ones:
>>>
>>> .
>>> .
>>> .
>>> [INFO] cfg.AnnotationBinder Binding entity from annotated class:
>>> com.abc.xyz.entities.core.client.Client
>>> [INFO] annotations.EntityBinder Bind entity
>>> com.abc.xyz.entities.core.client.Client on table Client
>>> [INFO] cfg.AnnotationBinder Binding entity from annotated class:
>>> com.abc.xyz.entities.core.client.Address
>>> [INFO] annotations.EntityBinder Bind entity
>>> com.abc.xyz.entities.core.client.Address on table Address
>>> [INFO] cfg.AnnotationBinder Binding entity from annotated class:
>>> com.abc.xyz.entities.core.client.Phone
>>> [INFO] annotations.EntityBinder Bind entity
>>> com.abc.xyz.entities.core.client.Phone on table Phone
>>> .
>>> .
>>> .
>>>
>>> [INFO] cfg.HbmBinder Mapping class:
>>> com.abc.xyz.entities.core.client.Client_AUD -> Client_AUD
>>> [INFO] cfg.HbmBinder Mapping class: Client_Address_AUD -> Client_Address_AUD
>>> [INFO] cfg.HbmBinder Mapping class: Client_Phone_AUD -> Client_Phone_AUD
>>> [INFO] cfg.HbmBinder Mapping class:
>>> com.abc.xyz.entities.core.client.Address_AUD -> Address_AUD
>>> [INFO] cfg.HbmBinder Mapping class:
>>> com.abc.xyz.entities.core.client.Phone_AUD -> Phone_AUD
>>> [INFO] cfg.HbmBinder Mapping class:
>>> org.hibernate.envers.DefaultRevisionEntity -> REVINFO
>>>
>>> Does this give any clues - HbmBinder vs. EntityBinder?
>>>
>>> Regards,
>>> Jim.
>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: [email protected]
>>> For additional commands, e-mail: [email protected]
>>>
>>>
>>
>>
>>
>> --
>> Howard M. Lewis Ship
>>
>> Creator of Apache Tapestry
>>
>> The source for Tapestry training, mentoring and support. Contact me to
>> learn how I can get you up and productive in Tapestry fast!
>>
>> (971) 678-5210
>> http://howardlewisship.com
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: [email protected]
>> For additional commands, e-mail: [email protected]
>>
>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]