Consider the following entities (getters, setters and PK omitted):
When loading a Container object, Hibernate creates an uninitialized proxy for the associated Food. The class of that proxy extends Food So tests like container.getFood() instanceof Cheese will return false, even if the underlying instance might be of that type. Since Hibernate 6.2 @Proxy(lazy = false) is deprecated. This was one way to get the correct java class, with the drawback that it effectively disabled lazy-loading. Assuming that the Container table has a new food_type discriminator column next to the food_id FK column, Hibernate could use that new information to create a proxy of the correct class. This would probably entail modifying the mapping, for instance adding a new @ManyToOneDiscriminatorColumn on the association:
An alternative would be that when the discriminator is part of an embedded id, Hibernate uses it create the correct class. Another solution would be an user-supplied service (injected in the SessionFactory) responsible for locating the correct type, based on the ID. This is a continuation of the discussion started here: https://discourse.hibernate.org/t/proxy-deprecated-in-hibernate-6-2/7707 |