2015-01-05 92 views
0

我使用弹簧和CGLIB增强了对象和我有这些类:我怎样才能通过CGLIB

public class A { 
    . 
    . 
    private Souscripteur souscripteur; 

    private List<B> contrat; 

    // getter and setter 
} 

public class B { 
    . 
    . 
    private Souscripteur souscripteur; 

//getter and setter 
} 

和类A和B具有相同的souscripteur,因此,当我加载A类并尝试加载类B,我得到B类EnhancerByCGLIB的Souscripteur。

对于这一点,当我尝试这样做:

if(b.getSouscriteur() instanceof PersonnePhysique) { 
//do something 
} else { 
//do nothing 
} 

当我检查代码,提高了对象是PersonnePhysique,但如果(b.getSouscriteur()的instanceof PersonnePhysique)返回false

我班PersonnePhysique是这样的:

public class PersonnePhysique extends Souscriteur { 
// 
} 
+0

究竟什么是你的问题?你是否实例化personnephysique对象(看起来你不是)?你为什么期望不同的行为? –

+0

增强的对象是PersonnePhysique,但是如果(b.getSouscriteur()instanceof PersonnePhysique)返回false –

+0

请注意输入错误:'Souscri [p] teur' ... – Vincent

回答

0

Hibernate会基于声明,预期型(Souscripteur)代理,所以你会得到一拉zy-loaded代理扩展Souscripteur - 因此,在instanceof意义上没有PersonnePhysique

你必须避免在这里测试具体类型,而是在你的实体上调用多态方法(顺便说一下,更多的面向对象)。

你的使用情况,只要你是调用方法doSomething(),将成为:

b.getSouscriteur().doSomething() 

具有以下实现:

public class Souscripteur { 
    public void doSomething() { 
     // do nothing 
    } 
} 

public class PersonnePhysique extends Souscripteur { 
    @Override 
    public void doSomething() { 
     // do something here 
    } 
}