3

コードは次のとおりです。

    Patient patient = factory.createPatient();           

    Enhancer enhancer = new Enhancer();
    enhancer.setSuperclass(patient.getClass());
    enhancer.setCallback(new DefaultMethodInterceptor(patient));
    patient = (Patient) enhancer.create();

    assertThat(patient.getFirstName()).isNotNull();


    Enhancer enhancer2 = new Enhancer();
    enhancer2.setSuperclass(patient.getClass());
    enhancer2.setCallback(new DefaultMethodInterceptor(patient));
    patient = (Patient) enhancer2.create();

    assertThat(patient.getFirstName()).isNotNull();

最後のアサートで失敗します

net.sf.cglib.core.CodeGenerationException: java.lang.reflect.InvocationTargetException-->null
...
Caused by: java.lang.reflect.InvocationTargetException
...
Caused by: java.lang.ClassFormatError: Duplicate method name&signature in class file my/package/entity/Patient$$EnhancerByCGLIB$$ca1e6685$$EnhancerByCGLIB$$f52743be

Hibernateのエンティティを拡張したいので、これを尋ねますが、すでに拡張されたエンティティがそれ自体で返され、2番目の拡張が失敗することがあります。どうすればこれを回避できますか?

4

2 に答える 2

6

Enhancer.isEnhanced()クラスがメソッドを介してすでに拡張されているかどうかを確認する必要があります。

そうである場合は、上記のコードで行ったようなすでに拡張されたバージョンではなく、 2番目の拡張を元のクラスに適用する必要があります。実装内で拡張機能を複合することはできますMethodInterceptor.intercept()が、注意して行う必要があります。

于 2009-08-14T18:46:30.907 に答える
2

これは私にとっても非常に役に立ちました。チェーンの上位にあるgetSuperclass()を呼び出し、それぞれについてEnhancer.isEnhanced()をチェックすると、適切なスーパークラスが見つかるはずであることを指摘したかっただけです。

于 2010-04-05T16:38:41.290 に答える