[hibernate-dev] Envers compile issue

Steve Ebersole steve at hibernate.org
Fri Apr 12 10:08:17 EDT 2013


In the meantime (to get the builds working again) I went ahead and 
implemented the explicit checking.  If you want to change something 
there, just look for usages of the new 
org.hibernate.envers.configuration.internal.metadata.FormulaNotSupportedException. 
 There are only 2 places it is used, both in MetadataTools...


On Fri 12 Apr 2013 08:03:59 AM CDT, Steve Ebersole wrote:
> Hi Lukasz,
>
> The problems seem limited to usages of:
> 1)
> org.hibernate.envers.configuration.internal.metadata.MetadataTools#getColumnNameIterator
> 2)
> org.hibernate.envers.configuration.internal.metadata.MetadataTools#addColumns
>
> from:
>
> 1)
> org.hibernate.envers.configuration.internal.metadata.AuditMetadataGenerator#createJoins
> 2)
> org.hibernate.envers.configuration.internal.metadata.BasicMetadataGenerator#addManyToOne
> 3)
> org.hibernate.envers.configuration.internal.metadata.BasicMetadataGenerator#addBasic
> 4)
> org.hibernate.envers.configuration.internal.metadata.CollectionMetadataGenerator#addWithMiddleTable
> 5)
> org.hibernate.envers.configuration.internal.metadata.CollectionMetadataGenerator#addValueToMiddleTable
> 6)
> org.hibernate.envers.configuration.internal.metadata.ToOneRelationMetadataGenerator#addToOne
>
>
> org.hibernate.envers.configuration.internal.metadata.MetadataTools#addColumns
> unfortunately goes through a number of internal addColumns/addColumn
> calls.
>
> Oddly enough, I found that there is in fact:
> 1)
> org.hibernate.envers.configuration.internal.metadata.MetadataTools#addColumnsOrFormulas
> 2)
> org.hibernate.envers.configuration.internal.metadata.MetadataTools#addFormula
>
> But that is only ever used to handle discriminators, as you
> mentioned.  Additionally, I then text searched the envers testsuite
> and found that only the
> org.hibernate.envers.test.integration.inheritance.single.discriminatorformula
> package contained any references to the text 'formula', which further
> illustrates that.
>
> So, all that said, I *think* envers already errored when it
> encountered formula (with CCE).  In the code I saw it is clearly
> expecting Iterator<Column> and not even checking if the Iterator
> returned Formula elements mixed in.
>
> At the end of the day it is still y'alls call.  Based on my reading of
> the current code, I think a comparable (though better) solution is to
> explicitly check each Iterator element type and throw that more
> descriptive exception[1].  That change I can make.  If y'all would
> rather add in real formula support, thats probably something y'all
> will have to work on.
>
> WDYT?
>
>
> [1] For example, FormulaNotSupportException( "Formula mappings are
> currently not supported in envers aside from @DiscriminatorValue; for
> more information, please see blah-blah-blah..." )
>
> On Apr 12, 2013 4:52 AM, "Łukasz Antoniak" <lukasz.antoniak at gmail.com
> <mailto:lukasz.antoniak at gmail.com>> wrote:
>
>     Hello Steve,
>
>     In general Envers does not support formula columns. Probably we
>     should save formula value to audit table. This can be tricky and I
>     have to think it over. Copying formula column to audit entity
>     would not produce expected result in all cases (e.g. time
>     functions used in formula expression). Currently we
>     support @DiscriminatorFormula annotation without saving its value
>     to audit table, since entities do not change their type.
>
>     @Adam: Thoughts? What do you think about copying formula column to
>     audit entity directly? Simplest solution AFAIK.
>
>     All usages of org.hibernate.mapping.Value#getColumnIterator(),
>     except the one in
>     org.hibernate.envers.configuration.internal.metadata.BasicMetadataGenerator,
>     map relation properties. IMO it is safe assumption that we are
>     dealing with columns there.
>
>     @Steve: if you agree, feel free to throw an exception if
>     encountered formula column in BasicMetadataGenerator asking to
>     register new feature.
>
>     Best regards,
>     Lukasz
>
>
>
>     2013/4/11 Steve Ebersole <steve at hibernate.org
>     <mailto:steve at hibernate.org>>
>
>         One option just came to mind.  Looking at the code, I have to
>         assume envers really just does not support formulas.
>          Otherwise, all these compile errors would eventually have
>         resulted in runtime (CCE) exceptions.
>
>         If that is really the case, I could add detection of that and
>         throw a more meaningful exception.  If that sounds like a
>         reasonable option, just let me know and I'll make that change.
>
>         Alternatively I could just log a message and keep going, but i
>         don't think that's a good choice.
>
>
>
>         On Thu 11 Apr 2013 04:07:27 PM CDT, Steve Ebersole wrote:
>
>             I just made a change to help catch runtime problems that
>             kept cropping
>             up.  The change was to
>             org.hibernate.mapping.Value#getColumnIterator.
>             The problem is that code in many modules (hem, envers)
>             that actually
>             deals with mapping code were making a bad assumption here.
>              The
>             returned iterator actually returns a Iterable<Selectable>, not
>             Iterable<Column>. Selectable is the contract shared
>             between Column and
>             Formula.  So when code non-defensively tries to treat that
>             thing as a
>             Iterable<Column> we often have issues.
>
>             Yes, the method is very poorly named.  Actually it
>             predates formula as
>             a feature.  But be that as it may, the code casting those
>             elements to
>             Column are just wrong.
>
>             For envers, I am not actually sure how to handle Formula
>             elements. I
>             need some help there.  The issues are all isolated to
>             org.hibernate.envers.configuration.internal.metadata
>              Could someone
>             more familiar with envers (and especially its entity
>             definition stuff)
>             take a look?
>
>             Thanks!
>
>


More information about the hibernate-dev mailing list