[bv-dev] TraversableResolver and JPA

Emmanuel Bernard emmanuel at hibernate.org
Mon Oct 9 05:56:32 EDT 2017


The reason was to be able to validate entities outside of explicit JPA calls and not cross the lazy loading boundaries.
It would become a very big overhead to load data from the database for validation.

> On 6 Oct 2017, at 16:13, Guillaume Smet <guillaume.smet at gmail.com> wrote:
> 
> Hi,
> 
> A user of Hibernate Validator reported an interesting case here:
> https://hibernate.atlassian.net/browse/HV-1489 .
> 
> The fact is that a method implemented in WebLogic is suboptimal but I
> think there is an interesting point here anyway.
> 
> In the spec, we say that when we find a JPA implementation in the
> classpath, we enable the JPATraversableResolver. This adds an overhead
> even for unmanaged entities as there is no way to tell if an object is
> a managed entity or a plain bean.
> 
> In EclipseLink, they override the traversable resolver in the context
> when validating the object on persist and I think it might be good
> idea: their JPA resolver is only used when persisting entities and
> when other objects are validated, the default traversable resolver is
> used - in the case of our user, it uses our JPATraversableResolver
> which leads to the issue he reported.
> 
> There is another advantage to this approach: the TraversableResolver
> is in the JPA implementation so it can use optimized calls to internal
> classes, instead of relying on the JPA API.
> 
> The problem with such an approach is that the user can't override the
> traversable resolver set by the JPA provider.
> 
> There is another trade-off: if the user tries to validate an entity
> outside of the JPA persist listener, it won't use the specific JPA
> resolver.
> 
> I wasn't there when this section was added so I'm not sure what was
> exactly the rationale for it.
> 
> I think we might have underestimated the overhead of our approach. We
> have a cache but the cache is per validation call so if you end up
> validating each object only once per call (and it's probably the most
> common case), the cache doesn't bring anything to you (except an
> additional overhead).
> 
> -- 
> Guillaume
> _______________________________________________
> beanvalidation-dev mailing list
> beanvalidation-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/beanvalidation-dev




More information about the beanvalidation-dev mailing list