com.sun.jdi.InvocationExceptionは必ずしもHibernateのせいではありません



Com Sun Jdi Invocationexception Is Not Necessarily Hibernates Fault



HibernateDaoSupportのサブクラスには、次のステートメントがあります。ListretValue = getHibernateTemplate()。find( 'from ViewAttachAuth where 1 = 1')、ここで、ViewAttachAuthは、データベース内のビューにマップされたカスタムエンティティオブジェクトであり、妥当です。 retValueはArrayList型のオブジェクトであり、retValueの各要素はViewAttachAuthオブジェクトである必要がありますが、デバッグすると、返されたオブジェクトのtoString()メソッドが実際に 'com.sun.jdi.InvocationExceptionが発生したことがわかりました。呼び出し方法。 '、そして通常のArrayListオブジェクトのtoStringメソッドは明らかに同じではありませんが、それを使用するためのListインターフェイスとして使用する場合は問題はなく、System.out.println(retValue)の場合はjava.langです。 StackOverflowErrorスタックオーバーフローエラー。プログラムがクラッシュします。包括的なオンライン関連の投稿とHibernateを使用した独自の経験により、この現象はHibernateのキャッシュと遅延読み込み戦略に関連していると事前に結論付けられましたが、ViewAttachAuthに対応するビューには多くのレコードがなく、このような小さな場合は4つまたは5つだけです。データの量。 Hibernateは第2レベルのキャッシュを開始しませんが、何が起こっているのかを考えることは依然として良い考えのようです。

次の数分で、私の頭の中には常に文字列toStringがあります。これは、toString自体のメソッドに問題はありません。この考えに従って、私は自分のエンティティクラスViewAttachAuthをチェックし、そのtoStringメソッドが次のように定義されていることを発見しました。



public String toString() { return org.apache.commons.lang.ObjectUtils.toString(this) }

だから私はそれを次のように変更しようとしました:

public String toString() { StringBuffer sb=new StringBuffer('[') sb.append('lsh='+getLsh()+',') sb.append('aname='+getAname()+',') sb.append('asize='+getAsize()+',') sb.append('description='+getDescription()+',') return sb.toString() }

残念ながら(^ _ ^)、問題は解決しました。そのため、org.apache.commons.lang.ObjectUtils.toString(Object obj)のソースコードを確認し、その中のどのような魔法がプログラムのクラッシュを引き起こしたのかを確認するしかありませんでした。次のシーンは私を驚かせました。以下はObjectUtilsのtoStringメソッドのソースフラグメントです。



public static String toString(Object obj) { return obj == null ? '' : obj.toString() }

私の元のtoStringメソッドがプログラムのクラッシュを引き起こす可能性があるのは当然のことです。これは無限ループです。プログラマーの敵!