問題タブ [discriminator]
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.
inheritance - JPA の SINGLE_TABLE 戦略と getter の @Discriminator による継承
SINGLE_TABLE 戦略を使用した JPA エンティティの継承に関する問題。getter @Discriminator では、継承の範囲を縮小します。
私は次の構造を持っています:
問題は次のとおりです。クラス C のオブジェクトがあります (継承 C も B であると仮定します)。私がやっているとき:
クラス B のオブジェクトのみをフェッチし、C はフェッチしません。ただし、C は B を拡張するため、リストにも含まれている必要があります。Getter は次のようなクエリを作成します。
問題は、このゲッター (Something.getListB) がこのリストを (ディスクリミネーター B によって) クラス B のみに縮小することです。この結果、オブジェクト クラス C はリストにありません。厳密な型「t1.type = B」を示す @Discriminator が原因です。「t1.type IN (B,C)」のようなセット/リストをそこに置くことはできません。
カスタム JPQL クエリは、さまざまな方法で構築されます。
そして彼らは彼らがすべきように働きます。しかし、ゲッターはどうですか?
興味深いのは、Something クラスを B クラスから A クラス (すべてのベース) に変更すると、次のようになるという事実です。// ゲッターとセッター }
これは問題を解決します。クエリのゲッターで:
「AND t1.type = ?」が消えます。動作しますが、「現実世界のオブジェクト」から「ORM エンティティ」へのマッピングを妨げます。その解決策は変化し、その抽象化を悪化させます。それはエレガントな解決策ではありません。
質問:
どうすればこの問題を解決できますか?
getter でカスタム JPQL クエリを使用できますか?
そのゲッターに B および C オブジェクトを取得させる方法は?
リストをリストに変更する代わりに、別の提案はありますか???
jpa - サブタイプを使用した双方向多対多 JPA マッピング
私の基本的なシナリオは、JPA でマッピングされている双方向の多対多の関係です。十分に単純です。ただし、マッピングに「タイプ」を追加する必要があり、最適な実装に苦労しています。概要は次のとおりです。
これが双方向である必要がない場合 (たとえば、ネットワークからメンバーにアクセスするだけでよく、反対方向に移動する必要がない場合)、私にとって最も明白な解決策は、メンバーの各セット ( network_member, suppressed_member, added_member
) ですが、逆にバラバラになります。単一のリンク テーブルを使用して、それを識別子列を持つエンティティに変換できると思いますが、誰かがリンク テーブルをエンティティとして使用するのを見るたびに、コードは惨事に変わるようです。
似たような質問をたくさん見つけましたが、質問が具体的すぎるか、求めている解決策が回答に含まれていませんでした。この状況を処理する最善の方法について何か提案はありますか?
c# - 関連する表からの流暢なnhibernate弁別器
次の3つのテーブルの値の例を示します。
私が持っている
そして、車両#1をロードするときにnhibernateがConcrete1をインスタンス化するようにしたい
Vehicle /*Concrete1*/ v = session.load<Vehicle>(1);
自動マッピングでそれを行うにはどうすればよいですか?前もって感謝します。
編集1
これは不可能だと思い始めているので、回避策をいただければ幸いです。xml(流暢ではない)バージョンの手がかりは、どちらか非常に役立つかもしれません。
fluent-nhibernate - 流暢なNHibernate:弁別者との多対多の関係をマッピングする方法
FluentNHibernateでマッピングする必要がある次のテーブルとエンティティがあります。
テーブル:
このデータベース設計の考え方は次のとおりです。
「ワークエリア」または「要素」は複数の「添付ファイル」ファイルを持つことができ、「添付ファイル」ファイルは複数の「ワークエリア」または「要素」によって参照される可能性があります。
「ワークエリア」または「要素」は、同じ「添付ファイル」ファイルを参照できます。
したがって、「添付ファイル」と「ワークエリア」または「要素」の間の関係は、「objectattachment」テーブルに格納されます。
「attachmentid」フィールドは、特定の「添付ファイル」の識別子を指します。
「attachmenttype」フィールド(識別子)は、この関係が「attachment」と「workarea」の間にあるのか、「attachment」と「element」の間にあるのかを定義します。
「objectid」フィールドは、上記の「attachmenttype」フィールドの値に応じて、特定の「workarea」または「element」の識別子を参照します。
次に、データベースの設計に基づいて、ドメインモデルクラスを次のように定義します。
ここで私の質問は、これらのドメインモデルクラスを上記のデータベース設計でマッピングできるかどうかです。はいの場合、どうすればそれを行うことができますか?いいえの場合、現在のデータベース設計を変更したくないので、設計されたデータベースに対してFluent NHibernateマッピングをサポートするようにドメインモデルクラスを変更するにはどうすればよいですか(つまり、「workarea」と「element」に別々の「添付ファイル」テーブルを作成します) 。
よろしく、クアン
inheritance - Doctrine 2 Discriminator Inheritance Mapping により、findBy メソッドが機能しない
私は2つのエンティティを持っています.1つはディスクリミタなどで構成されるメインのスーパークラスとして、もう1つはこのスーパークラスを拡張するものです...すべてのアクションをActionと呼ばれる1つのテーブルに記録できます。
私の識別エンティティ:
これは、上記の識別エンティティを拡張するために使用するエンティティの 1 つです。
これは、コメントエンティティを永続化するとうまく機能します。
私が固執すると、アクションがアクションテーブルに正常に追加されます...
ただし、findBy、findByOne メソッドはもう使用できません。これらのメソッドからの結果の戻り値 = null になりました。コメント クラスを編集して「アクションから拡張」を削除すると、教義の findby、findOneBy メソッドが機能し始めますが、メインの Actions スーパークラスを拡張していないため、tmy 識別子テーブルに追加されません...
アクションを拡張し、find、findOneBy などの教義メソッドも機能させるために必要です...
助言がありますか?
inheritance - Doctrine2でディスクリミネーターを動的に設定する
継承を実装Parent
する2つの子エンティティ(Foo
および)を持つエンティティがあります。Bar
SINGLE_TABLE
エンティティを作成し、その識別子を作成する代わりにnew Parent()
動的に設定することは可能ですか?foo
new Foo()
hibernate - エンティティ Hibernate としてマップされた識別子列
休止状態では、識別器をエンティティとして持つことは可能ですか? たとえば、Department を基本クラスとして、AdminDepartment と ProcessingDepartment をサブクラスとして持つとします。DepartmentType は識別子であり、DEPT_TYPE テーブルにマップされたエンティティです。
jpa - 主キー/IDの一部としてのDiscriminatorColumn
状況
DiscriminatorColumn
単一テーブル継承用に構成された、を持つエンティティがあります。
'ContainerAssignment'には、別のエンティティへの参照があります。
コンテナにはContainerAssignment
、各TYPEの1つが含まれる場合があります。これは、テーブルの主キーがとContainerAssignment
によって定義されることを意味します。CONTAINER_ID
TYPE
ContainerAssignment
いくつかのサブクラスがあります。
SomeTypeOfContainerAssignment
特定のに対して1つのインスタンスのみが存在しますCONTAINER_ID
。
問題
JPA@Id
をContainerAssignmentテーブルのContainerとして定義すると、実行できますentityManager.find(SomeTypeOfContainerAssignment.class, containerId)
。これはすばらしいことです。これは、の線に沿って何かを実行しますSELECT * FROM CONTAINER_ASSIGNMENT WHERE CONTAINER_ID = 1 AND TYPE = 'SOME_TYPE';
。@DiscriminatorValue("SOME_TYPE")
エンティティに注釈があるため、ここでTYPEチェックが必要であることを認識しています。
ただし、これは、Containerが実際には主キーではないため、ContainerからContainerAssignmentへの逆参照が壊れることを意味します。たとえば、Containerにが含まれている場合、コンテナ@OneToOne(mappedBy=container) private SomeTypeOfContainerAssignment assignment;
を読み込むとSELECT * FROM CONTAINER_ASSIGNMENT WHERE CONTAINER_ID = 1;
、型チェックなしで、のようなものによって割り当てが読み込まれます。これにより、コンテナのすべての割り当てが与えられ、次に、一見ランダムに見えるものを選択します。タイプが間違っている可能性があります。その場合、例外がスローされます。
代わりに、ContainerAssignmentのJPA@Id
をcontainerとtypeを使用した複合IDとして定義すると、ContainerAssignmentのサブクラスへの参照は正常に機能します。
ただし、entityManager.find(SomeTypeOfContainerAssignment.class, containerId)
containerIdはIDではないため、実行できません。私がしなければならないentityManager.find(SomeTypeOfContainerAssignment.class, new MyPk(containerId, "SOME_TYPE"))
、それはのポイントを打ち負かすようです@DiscriminatorValue("SOME_TYPE")
。とにかく検索時にタイプを指定する必要がある場合は、単一のContainerAssignmentエンティティを使用する方がよいでしょう。
質問
単一テーブル継承エンティティのサブクラスへの作業参照を持つ方法はありますか?テーブルの主キーがディスクリミネーター列で複合されている一方EntityManager.find
で、主キーの一部だけで参照できる方法はありますか?弁別者ではありませんか?
c# - Subtype Discriminator はどのように使用されますか?
多くのサブタイプ テーブルを持つスーパータイプ テーブルがあるとします。スーパータイプ テーブルが行ごとに可能なサブタイプ テーブルの 1 つだけを指しているという点で、それらを互いに素なサブタイプにすることに興味があります。Webで、行が属するサブタイプを識別する小さなコード (通常は文字) であるスーパータイプ テーブルに入れられる新しい列であるサブタイプ ディスクリミネータの説明に出くわしました。
実際には、これの実際の例は見つかりませんでした。私が C# で作業していた場合、テーブルのサブタイプ識別子列をクエリしてから、いくつかのキー - >値リスト ([サブタイプ識別子] - > subtype_table_name) に対してテストして、正しいテーブルに参加するための適切な SQL を作成すると思いますか?
または、この目的のために SQL Server に既にいくつかのビュー/SQL クエリ構文がありますか?
基本的に、ディスクリミネーターを有効にするために実際にどのレベルでロジックを実行する必要があるのか 疑問に思っています。
c# - ディスクリミネータで C# MongoDB LINQ を使用する
すべて共通のクラス D から継承する 3 つの異なるクラス (A、B、C) のドキュメントを保持する単一の MongoDB コレクションがあります。
公式の C# ドライバーを使用して、3 つのタイプ (A、B、C) のすべてのドキュメントを挿入しました。それらはすべて _t 識別子で正しく表示され、私のコードではそれらのクラス マップが登録されています。
次のような LINQ クエリを発行した場合 (VB を使用):
この結果をカウントすると、「要素 'クラス A の要素名' は、クラス C のどのフィールドまたはプロパティとも一致しません。」というエラーが表示されます。
AsQueryable(Of C)
弁別器は、コードのここで作動することを意図したものではありませんか? .Count
クラス C の要素に固有の Where 句を発行すると、A、B、および C のドキュメントに適用されているようです。
効果なしで追加しよ.OfType(Of C)
うとしましたが、最初に でリストに変換しようとしました.ToList
が、引き続き同じエラーが発生します。何か案は?
背景として、私のクライアント コードは通常、タイプ D のオブジェクトを処理します。A、B、C は、インデックスを配置したい D から継承された多くの共通プロパティを共有するため、それらを 1 つのコレクションに配置します。ただし、場合によっては、特殊な状況で型 A、B、または C のオブジェクトを直接参照する必要があります。