問題タブ [many-to-one]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
nhibernate - NHibernateの多対1の関係で親のみを削除
Product
オブジェクトと。の間には多対1の関係がありますSupplier
。それに属するを削除Supplier
せずに削除できる必要があります。Product
クラスの簡略化されたバージョンは次のとおりです。
FluentNHibernateを使用していますが、生成されるマッピングは次のとおりです。
これにより、Productsテーブルに外部キーが作成されるため、Supplierで直接削除を実行しようとすると、外部キー制約エラーが発生します。関係を削除するだけであると期待して、カスケードを「all」に変更しようとしましたが、すべての製品とそれに関連する他のオブジェクトが削除されました。
これを今すぐ解決するために私が見ることができる唯一の方法は、SupplierのProductsコレクションを繰り返し、Supplierプロパティをnullに設定することです。マッピングを通じてこの動作を実現する方法はありますか?
hibernate - Hibernate - アップデートで変更された子コレクション識別子
オブジェクト RFQ を更新しようとすると、Hibernate はその子コレクション BQMaster を更新し、通常は許可されない BQMaster の識別子を設定および更新しようとする傾向があります。
postgre ログ ファイル:
2009-05-22 11:16:53 エラー: 重複したキーが一意の制約 "bq_masters_pkey" に違反しています
2009-05-22 11:16:53 ステートメント: update bq_masters set rfq_id=$1, id=$2 where id= $3
コンソールのエラー:
原因: java.sql.BatchUpdateException: Batch entry 0 update bq_masters set rf q_id=2, id=0 where id=49449 was aborted. getNextException を呼び出して原因を確認します。
org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handle エラー (AbstractJdbc2Statement.java:2392)
で org.postgresql.core.v3.QueryExecutorImpl.processResults (QueryExecutor Impl.java:1257)
で org.postgresql.core.v3.QueryExecutorImpl .execute(QueryExecutorImpl.ja va:334)
org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc 2Statement.java:2451) org.hibernate.jdbc.BatchingBatcher.doExecuteBatch
(BatchingBatcher.jav a:58)
.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java: 195)
... 32 以上
bq_masters の ID を更新しようとしたため、非常に奇妙に思えます。ID を保持し、他のフィールドのみを更新する必要があります。
休止状態のマッピング:
参照用のデータベース構造:
RFQ の 1 対多のマッピングに inverse="true" を追加しようとしましたが、対応する RFQ オブジェクトの BQMasters が更新されないため、役に立ちませんでした。
誰もこの問題を解決する手がかりを持っていますか? 前もって感謝します。
hibernate - hql を介して 1 対 1 のコンポジションを遅延ロードする方法
エンティティ B との双方向の 1 または 0 対 1 マッピングを持つエンティティ A があるとします。
マッピングは次のとおりです。
と
EntityA に対して hql クエリ (または名前付き hql クエリ) を実行すると、hibernate は別の select ステートメントで EntityA#propertyB を積極的に読み込みます。
それに関する私の問題は、私の hql が 1000 個の EntityA を返した場合 (すべてが独自の EntityB を持っている)、休止状態が n+1 クエリを実行することです (最初のクエリは 1000 の結果を返す EntityA 用であり、n 個のクエリは EntityA からのものです。 propertyB は遅延読み込みを選択します)。
ただし、これらの EntityA#propertyB は必要ありません。そのため、代わりにそれらを遅延ロードしたいのです (休止状態に別の SQL クエリを使用させることなく)。
それは可能ですか?もしそうなら、どうすればいいですか?
ありがとう、フランツ
hibernate - 内部結合フェッチプロパティが関連付けられていない場合、多対1のhqlクエリを休止状態にします
hbm.xmlに、次のように多対1の関連付けを設定しています。
そして、私はインストルメンテーションを使用して真の遅延読み込みを行っています。
しかし、他のテーブルへの内部結合フェッチを使用してhqlクエリを実行すると、他のテーブルの値であるオブジェクトを含む必要があるプロパティはnullのままになります。他のテーブルの値のオブジェクトがhibernateによって作成されているのを見ることができますが。
誰かがこの問題について何か洞察を持っていますか?
アップデート:
nhibernate - Hibernate の多対 1 ロードの代替手段
次のように、親/子オブジェクト/マッピングがあります。
Parent Parent
Childでプロパティを使用したくありません。使いたいですint ParentId
。それをマッピングするにはどうすればよいですか?
nhibernate - 特定のシナリオ (1 対多/1 対 1) の正しい NHibernate マッピング
私は次の構造を持っていました:
これは次のように翻訳されました
ここで、履歴に日付を追加して、次のクラス構造を作成します。
dbスキーマをほとんど変更せずに維持する
Read
にマップしたいのですがUserHistory
、質問は次のとおりです。
id
のマッピングでは何を使用すればよいRead
ですか?UserHistory
主キーは(UserId, BookId)
.id
NH が機能するには が必要ですか?UserHistory -> Book
の場合のようですone-to-one
。この場合、BookId
列名を指定するにはどうすればよいですか?UserHistory
列属性が表示されませんone-to-one
(列名について明示する理由があります)。
nhibernate - NHibernate:単一の列を多対1からプリミティブ型にマッピングする
私は次のマッピングを持っています:
さて、ドメイン内のRoleに個別のクラスを持たせたくはありません。必要なのは、Role名だけです。ただし、DBでは、ロールは別のテーブルに正規化する必要がありますRole (Id, Name)
。
Peopleが次のPersonRoleクラスを使用するようにマップするにはどうすればよいですか?
更新:賞金を追加しました。私だけでなく役立つ質問のようです。
nhibernate - Hibernate: SaveOrUpdate による
同じエンティティが既に存在するかどうかに応じて、NH INSERT または UPDATE をエンティティにする簡単な方法はあり<natural-id />
ますか?
エンティティは、 を使用して別の (ルート) エンティティにマップされ<many-to-one cascade="save-update" />
ます。
java - JPAを使用してdb-imported国をアドレスエンティティにマッピングする
DDL スクリプトを実行して、データベースに完全な国テーブルをセットアップしました。国テーブルの主キー列には、すべての国に対応する ISO コードが含まれています。
私の JPA プロジェクトには、埋め込まれた Address エンティティを持つ User エンティティがあり、この Address エンティティには Country への参照があります。User と Address の関係は問題ないように思えますが、Address と Country の関係が問題です。多くのアドレスが国を共有できるため、これを ManyToOne 関係としてマッピングしようとしました。
問題: Country クラスの iso メンバー変数に Id で注釈を付けました -> JPA/Hibernate は、国の ID を手動で設定していないと文句を言います。ただし、この場合、データを一度インポートし、ISO コードが一意であり、db スキーマによって主キーとして宣言されているため、ID は既に指定および設定されています。この特殊なケースでは、国テーブルに更新や挿入を行う必要はありません。情報は読み取り専用にする必要があります。
何をすべきか、変更せずに国テーブルを使用できるようにするにはどうすればよいですか?