6

こんにちは、自分では解決できない問題があります。私は war ファイルを ear にパッケージ化し、JPA プロバイダーとして hibernate 3.5 を使用して glassfish 3.0.1 で実行しています。私はそれをmavenでコンパイルし、アイデアまたは手動で展開します。1 回おきに、DAO でキャスト例外が発生します。

java.lang.ClassCastException: com.myproject.domain.entity.User cannot be cast to 
com.myproject.domain.entity.User

それ以外の場合は、完全に正常に機能します。この動作にパターンはありません。誰かがここで起こっていることに光を当てることができますか?

com.myproject.domain.dao.UserDAOImpl.checkUserSessionValid(UserDAOImpl.java:195) で例外がスローされたメソッドの例

public User checkUserSessionValid(String sessionId) {
        User user = null;
        EntityManager em = provider.entityManager();

        try {
            em.getTransaction().begin();
           //Query q = em.createQuery("SELECT u FROM User u WHERE u.session.sessionId = :sessionId"); makes no difference :/
            Query q = em.createQuery("SELECT u FROM User u WHERE u.session.sessionId = :sessionId",User.class);
            q.setParameter("sessionId", sessionId);
            user = (User) q.getSingleResult();

            em.getTransaction().commit();
        } catch (NoResultException ignored) {

        } finally {
            em.close();
        }

        return user;
 }

My libraries
[INFO] +- org.apache.geronimo.specs:geronimo-jpa_2.0_spec:jar:1.0:provided
[INFO] +- javax.validation:validation-api:jar:1.0.0.GA:compile
[INFO] +- org.hibernate:hibernate-annotations:jar:3.5.1-Final:compile
[INFO] |  +- org.hibernate:hibernate-core:jar:3.5.1-Final:compile
[INFO] |  |  +- antlr:antlr:jar:2.7.6:compile
[INFO] |  |  +- commons-collections:commons-collections:jar:3.2.1:compile
[INFO] |  |  +- dom4j:dom4j:jar:1.6.1:compile
[INFO] |  |  |  \- xml-apis:xml-apis:jar:1.0.b2:compile
[INFO] |  |  \- javax.transaction:jta:jar:1.1:provided (scope managed from compile)
[INFO] |  +- org.hibernate:hibernate-commons-annotations:jar:3.2.0.Final:compile
[INFO] |  +- org.hibernate.javax.persistence:hibernate-jpa-2.0-api:jar:1.0.0.Final:compile
[INFO] |  \- org.slf4j:slf4j-api:jar:1.5.2:compile
[INFO] +- org.hibernate:hibernate-entitymanager:jar:3.5.1-Final:compile
[INFO] |  +- cglib:cglib:jar:2.2:compile
[INFO] |  |  \- asm:asm:jar:3.1:compile
[INFO] |  \- javassist:javassist:jar:3.9.0.GA:compile
[INFO] +- org.hibernate:hibernate-validator:jar:4.1.0.Final:compile
[INFO] +- org.slf4j:slf4j-simple:jar:1.5.2:test
[INFO] +- mysql:mysql-connector-java:jar:5.1.13:test
[INFO] +- org.hsqldb:hsqldb:jar:2.0.0:test
4

3 に答える 3

3

JBoss を使用して同様のエラーが発生することがありました。問題はクラスローダー(クラスローダーリポジトリ)の問題でした。複数のクラスローダーによって同じクラスがロードされた場合、ローダー 1 によってロードされたクラスとローダー 2 によってロードされたクラスが同じではないため、その例外が発生する可能性があります。

私たちのケースでは、値渡しセマンティクスを有効にすることでこれを解決できました。つまり、クラスローダー (またはアプリ) の境界を越えるたびに、値がシリアライズ/デシリアライズされます。おそらく、Glassfish についても確認できます (そして、そこでクラスのロードがどのように行われるかを調べます)。

クラスパスにライブラリの複数のコピーまたはバージョンがあるかどうかを確認することもできます。

于 2011-03-30T08:05:03.747 に答える
3

Google 経由でここに来るすべての人にとって、この問題は 4.3.6 以降に存在します: https://hibernate.atlassian.net/browse/HHH-9446

Hibernate 4.3.5 にダウングレードすることで、私たちのチームはうまくいきました。

于 2015-02-24T09:25:22.117 に答える
0

Netbeans またはその他の IDE を使用している場合は、生成されたソースを確認してください。

たとえば、NetBeansはUser_クラスを生成します。com.myproject.domain.entityパッケージ内の他のすべてのクラスに対しても同様です。

すべてのファイルを確認し、同じパッケージからインポートを削除します。プロジェクトをクリーンアップしないでください。同じパッケージからインポート ステートメントを使用してコードが再生成されるためです。もう一度ビルドしてからデプロイしてください。

念のため、すべてのクラスで次のステートメント (または同等のもの) を確認し、インポートが同じパッケージからのものである場合は削除します。

import com.myproject.domain.entity.User;

于 2014-06-07T01:36:03.643 に答える