Hibernate.MappingException:以下の永続化ツールはありません:XYZ
-
09-06-2019 - |
質問
さて、それを言う前に:私 した Googleと私 hbm.xml
ファイル は 埋め込みリソース。
私が呼び出しているコードは次のとおりです。
ISession session = GetCurrentSession();
var returnObject = session.Get<T>(Id);
これがクラスのマッピングファイルです。
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="HQData.Objects.SubCategory, HQData" table="SubCategory" lazy="true">
<id name="ID" column="ID" unsaved-value="0">
<generator class="identity" />
</id>
<property name="Name" column="Name" />
<property name="NumberOfBuckets" column="NumberOfBuckets" />
<property name="SearchCriteriaOne" column="SearchCriteriaOne" />
<bag name="_Businesses" cascade="all">
<key column="SubCategoryId"/>
<one-to-many
class="HQData.Objects.Business, HQData"/>
</bag>
<bag name="_Buckets" cascade="all">
<key column="SubCategoryId"/>
<one-to-many
class="HQData.Objects.Bucket, HQData"/>
</bag>
</class>
</hibernate-mapping>
これまでにこの問題に遭遇した人はいますか?
完全なエラー メッセージは次のとおりです。
MappingException: No persister for: HQData.Objects.SubCategory]NHibernate.Impl.SessionFactoryImpl.GetEntityPersister(String entityName, Boolean throwIfNotFound) in c:\CSharp\NH2.0.0\nhibernate\src\NHibernate\Impl\SessionFactoryImpl.cs:766 NHibernate.Impl.SessionFactoryImpl.GetEntityPersister(String entityName) in c:\CSharp\NH2.0.0\nhibernate\src\NHibernate\Impl\SessionFactoryImpl.cs:752 NHibernate.Event.Default.DefaultLoadEventListener.OnLoad(LoadEvent event, LoadType loadType) in c:\CSharp\NH2.0.0\nhibernate\src\NHibernate\Event\Default\DefaultLoadEventListener.cs:37 NHibernate.Impl.SessionImpl.FireLoad(LoadEvent event, LoadType loadType) in c:\CSharp\NH2.0.0\nhibernate\src\NHibernate\Impl\SessionImpl.cs:2054 NHibernate.Impl.SessionImpl.Get(String entityName, Object id) in c:\CSharp\NH2.0.0\nhibernate\src\NHibernate\Impl\SessionImpl.cs:1029 NHibernate.Impl.SessionImpl.Get(Type entityClass, Object id) in c:\CSharp\NH2.0.0\nhibernate\src\NHibernate\Impl\SessionImpl.cs:1020 NHibernate.Impl.SessionImpl.Get(Object id) in c:\CSharp\NH2.0.0\nhibernate\src\NHibernate\Impl\SessionImpl.cs:985 HQData.DataAccessUtils.NHibernateObjectHelper.LoadDataObject(Int32 Id) in C:\Development\HQChannelRepo\HQ Channel Application\HQChannel\HQData\DataAccessUtils\NHibernateObjectHelper.cs:42 HQWebsite.LocalSearch.get_subCategory() in C:\Development\HQChannelRepo\HQ Channel Application\HQChannel\HQWebsite\LocalSearch.aspx.cs:17 HQWebsite.LocalSearch.Page_Load(Object sender, EventArgs e) in C:\Development\HQChannelRepo\HQ Channel Application\HQChannel\HQWebsite\LocalSearch.aspx.cs:27 System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +15 System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +33 System.Web.UI.Control.OnLoad(EventArgs e) +99 System.Web.UI.Control.LoadRecursive() +47 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1436
アップデート, 、これが解決策です 私の シナリオは次のとおりでした:いくつかのコードを変更しましたが、実行時にアセンブリを構成ファイルに追加していませんでした。
解決
マッピング アセンブリをセッション ファクトリ構成に追加するのを忘れたようです。
app.config を使用している場合...
.
.
<property name="show_sql">true</property>
<property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
<mapping assembly="Project.DomainModel"/> <!-- Here -->
</session-factory>
.
.
他のヒント
明白ですが、Hibernate を初めて使用する人にとっては非常に便利です。
すべての XML マッピング ファイルは次のように扱う必要があります。 埋め込みリソース デフォルトではなく コンテンツ. 。このオプションは、ファイルのプロパティのビルド アクション属性を編集することで設定します。
その後、XML ファイルはアセンブリに埋め込まれ、NHibernate の構成フェーズでプロジェクトの起動時に解析されます。
私の問題は、マッピング XML の名前に .hbm を入れるのを忘れたことでした。また、必ず埋め込みリソースにしてください。
これを外しました ここ:
私の場合、マッピング クラスはパブリックではありませんでした。つまり、次の代わりに:
public class UserMap : ClassMap<user> // note the public!
私はちょうど持っていました:
class UserMap : ClassMap<user>
約4時間かけて グーグルする そして スタックオーバーフロー, 、そこら辺のことをすべて試してみたところ、エラーが見つかりました。
私のマッピングファイルは次のように呼ばれました .nbm.xml の代わりに .hbm.xml. 。それは正気の沙汰ではなかった。
私も同様の問題を抱えていましたが、次のように解決しました。
私は MS SQL 2008 で作業していますが、NH 構成では次のような不適切な方言がありました。NHibernate.Dialect。MsSql2005方言それを次のように修正すると、NHibernate.Dialect。MsSql2008方言その後、例外なくすべてが正常に動作します。「次の永続化はありません:」... "デビッド。
また、初期化中に間違ったアセンブリを追加していました。永続化しているクラスはアセンブリ #1 にあり、.hbm.xml ファイルはアセンブリ #2 に埋め込まれています。私が変更され cfg.AddAssembly(...
(アセンブリ #1 の代わりに) アセンブリ #2 を追加すると、すべてが機能しました。ありがとう!
Amolの答えに追加するために、インターフェイスクラスタイプを指定するのを間違えないでください。 必ず実装クラスを指定してください. 。(つまり。IDomainObjectType は使用しないでください)。私がこの間違いを犯したわけではありません...:)
そうあるべきか name="Id"
?タイプミスが原因である可能性があります。
次に、非ジェネリック テストを試して、適切な型パラメータが渡されていることを確認します。
エラーメッセージ全体を投稿していただけますか?
Configuration.AddAssembly() メソッドに間違ったアセンブリを追加していたため、同じ問題が発生しました。
このエラーは、マッピング構成が無効であるために発生します。セッション ファクトリの .Mappings をどこに設定したかを確認する必要があります。基本的にプロジェクト内で「.Mappings(」を検索し、以下の行で正しいエンティティ クラスを指定していることを確認してください。
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<YourEntityClassName>())
別個のアセンブリからリポジトリでテストを実行する場合は、Hibernate.cfg.xml が常にそのアセンブリの bin ディレクトリに出力されるように設定されていることを確認してください。これは私たちには起こらず、特定の状況で上記のエラーが発生しました。
免責事項:これは、リポジトリ統合テスト アセンブリの構造 (つまり、各テスト アセンブリから単一の Hibernate.xfg.xml へのシンボリック リンクがあります)
.config ファイルにマッピング情報を指定することを忘れないでください。
例えば
ここで、MyApp.Data はマッピングを含むアセンブリです。
ID でオブジェクトを検索するときにも同様の問題が発生しました...私がやったことは、クラス名に完全修飾名を使用することだけでした。それは以前でした:
find("Class",id)
オブジェクトなので次のようになりました:
find("assemblyName.Class",id)
電話をかけたことを確認してください。 CreateCriteria(typeof(DomainObjectType))
DB から取得するドメイン オブジェクトのセッションのメソッド。