[hibernate-dev] Bytecode enhancement and inheritance
Luis Barreiro
lbarreiro at redhat.com
Mon Jun 11 15:39:23 EDT 2018
Hi Guillaume,
Can you please check the behavior of with the Javassist enhancer in this
particular case? I believe it's the correct one, but one has to double
check.
Also, on a related issue, please check the comments I made on
https://hibernate.atlassian.net/browse/HHH-12593 about property access.
I think we need to sort out both aspects, the interception and enhancing
as mapped collection, in order to support this case properly. The former
is a bug but for the latter I don't see a good enough solution.
Let me know what you find so we can proceed on solving this out.
Regards,
Luis Barreiro
Middleware Performance Team
<https://red.ht/sig>
On 06/11/2018 06:34 PM, Guillaume Smet wrote:
> Hi Luis,
>
> This question is related to
> https://hibernate.atlassian.net/browse/HHH-12601 .
>
> AFAICS, the following case (e.g. having the fields defined in the
> parent class and the laziness defined in the child class) is not
> working very well with bytecode enhancement:
> ====
> @Entity
> public class RequestWithLazyEvents extends RelatedToEvents {
>
> @ManyToMany(fetch = FetchType.LAZY)
> @Fetch(FetchMode.SELECT)
> public Set<Event> getEvents() {
> return events;
> }
> }
>
> @MappedSuperclass
> public abstract class RelatedToEvents extends Base {
> protected Set<Event> events = new LinkedHashSet<>();
>
> public void setEvents(Set<Event> events) {
> this.events = events;
> }
> }
> ====
>
> By not working very well, I mean that the interceptor read/write
> methods are defined in the child class but the getters and setters are
> not intercepted because we only intercept the getters/setters if the
> fields are defined in the current class:
>
> See this method in PersistentAttributeTransformer and especially the
> last test:
> ====
> private boolean isEnhanced(String owner, String name, String desc) {
> for ( FieldDescription enhancedField : enhancedFields ) {
> if ( enhancedField.getName().equals( name )
> && enhancedField.getDescriptor().equals( desc )
> &&
> enhancedField.getDeclaringType().asErasure().getInternalName().equals(
> owner ) ) {
> return true;
> }
> }
> return false;
> }
> ====
>
> (Note that supporting this case is not only a matter of removing the test)
>
> I don't know if it's a case we want to support or not but I'm a bit
> worried that we don't throw any error and the collection is not loaded
> at all (as the rest of ORM supposes the enhancer will do the work).
>
> You end up saving the collection in the database and when you get it
> back the collection is always empty.
>
> It can lead to serious data loss if you save the entity back to the
> database thus I think it's somewhat critical to fix it.
>
> WDYT?
>
> --
> Guillaume
More information about the hibernate-dev
mailing list