2

次の Spring Bean を持つ Hibernate/Spring アプリケーションがあります。

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager" />
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" />

アプリケーションを一緒に配線すると、休止状態のエンティティでプライベート コンストラクターを使用すると、次のエラーが発生します。

Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: No visible constructors in class 'ourclass'

エンティティは、従業員などの典型的なドメイン オブジェクトです。

コンストラクターの可視性修飾子をパッケージ (またはパブリック) に変更すると、アプリケーションは正常に動作し、エンティティはデータベースに格納/ロードされます。Spring/Hibernate トランザクション管理でプライベート コンストラクター/静的ファクトリ メソッドを使用するにはどうすればよいですか?

Hibernate アノテーションを使用して、エンティティ/関係をマッピングします。問題に関連するドメイン クラスの applicationContext.xml で Bean 定義が宣言されていません。これは、静的ファクトリ メソッドとプライベート コンストラクタを持つ必要がある pojo です。

Hibernate (私が推測する org.springframework.spring-orm.hibernate3 クラス) でコンストラクターの代わりに静的ファクトリー メソッドを使用するにはどうすればよいでしょうか? または、必要に応じてプライベートコンストラクターを呼び出すようにしますか?

spring factory-method 構成を使用することは理にかなっていますが、エンティティは applicationContext.xml で Bean としてマップされていません。これらは、Hibernate の永続性のために @Entity アノテーションでのみアノテーションが付けられます。

この編集により、質問が(わかりにくくなるのではなく)明確になることを願っています。:)

4

4 に答える 4

5

私はSpringを使用していませんが、ファクトリメソッドまたは複数の引数コンストラクターを介してインスタンス化する必要があるクラスを持つプロジェクトでHibernateを使用しました。

これは、オブジェクトをインスタンス化する必要があるときやオブジェクトがロードされたときなど、いくつかの重要な休止状態イベントをリッスンするクラスである Interceptor を介して行うことができます。

オブジェクトをインスタンス化する独自の手段を Hibernate に使用させるには、次のようにします。

public class MyInterceptor extends EmptyInterceptor {

    public Object instantiate(String entityName, EntityMode entityMode, Serializable id) {
        if(entityName.equals(Foo.class.getName())
             return Foo.create();
        return null;
    }
}

リフレクションで回避でき、プロジェクトでその問題が発生していないことを考えると、非表示のコンストラクターでオブジェクトをインスタンス化しない Hibernate に問題があることに少し驚いています (実際に表示されているクラスはありません)。コンストラクター)。それはSpringの何かかもしれません。使用している休止状態のバージョンも確認してください。

于 2008-12-07T19:32:02.897 に答える
1

プロパティ "factory-method" について知っていますか? コンストラクターの代わりにそのメソッドを呼び出して、Bean をインスタンス化することができます。

于 2008-12-03T09:22:39.027 に答える
0

Springリファレンスのセクション3.2.3.2では、SpringでBeanをインスタンス化するいくつかの異なる方法について説明しています。

静的ファクトリメソッドまたはインスタンスファクトリメソッドのいずれかに関心があります。すべてのサブセクションはかなり短いです。ご覧になり、他にご不明な点がないか確認してください。

于 2008-12-03T16:48:43.900 に答える
0

javassistまたはcglibランタイムで作成されたサブクラスを経由しない限り、Hibernate(または外部フレームワーク)にオブジェクトのプライベートコンストラクターを呼び出させることはできないと思います。

Hibernateにコンストラクターを呼び出させたい場合は、それを作成してみませんpublicpackage?Hibernateは、デフォルトの引数なしコンストラクターを呼び出すことにより、オブジェクトをインスタンス化します。ドキュメントには、クラスには、パッケージまたはパブリックの可視性を備えたデフォルトの引数なしコンストラクターが必要であると記載されています。finalアソシエーションを使用するときにHibernateがプロキシを作成するため、クラスがそうである必要はありません。

于 2008-12-03T15:00:02.480 に答える