Quantcast
Channel: Thorsten Maier – techscouting through the java news
Viewing all articles
Browse latest Browse all 44

Instanceof fails with Hibernate lazy-loading and entity class hierarchy

$
0
0

Hibernate uses proxied classes for implementing lazy-loading of entities. If you use a class hierarchy with Hibernate and table ter hierarchy inheritance, it may come to the following problem:

Hibernate may return a proxy instead of a normal instance because of lazy loading. This proxy is a subclass of the superclass of your entity but not a subclass of your own subclass. Look at the example:

public class Superclass {...}

@Entity
public class Subclass1 extends Superclass {...}

@Entity
public class Subclass2 extends Superclass {...}

If you have an instance of subclass “Subclass1″, anyhow a call of getClass(…) may return a proxy which is not an instance of Subclass1:

System.out.println(instanceOfSubclass1.getClass())
// => class Superclass_$$_javassist_87

assertFalse(instanceOfSubclass1 instanceof Subclass1)
assertFalse(
instanceOfSubclass1 instanceof Subclass2)
assertTrue(
instanceOfSubclass1.getSuperclass().isCase(Superclass))

As an alternative the method Hibernate.getClass(…) can be used to determine the specific subclass of the entity:

assertTrue(Hibernate.getClass(instanceOfSubclass1).isCase(Subclass1))
assertFalse(Hibernate.getClass(instanceOfSubclass1).isCase(Subclass2))


Einsortiert unter:Did you know?, Java Persistence Tagged: Hibernate

Viewing all articles
Browse latest Browse all 44

Trending Articles