問題タブ [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.
grails - Grails で、基本型のすべてのサブクラスのすべての識別子値のリストを取得するにはどうすればよいですか?
次のクラスがあるとします。
などなど。次に、を拡張するすべてのサブクラスのすべての識別子値のリストを含むドロップダウンを表示する必要がありますFruit
。たとえば、次のようになります。
これらのうち 4 つをハードコードするのは簡単ですが、私の実際のドメインでは、このリストがかなり長くなる可能性があります。基本型を実装するすべてのサブクラスのすべての識別子値のリストを取得する方法はありますか? たとえば、次のようなものです。
grails - Grails では、単体テストで GrailsDomainBinder をモックするにはどうすればよいですか?
次のようなサブクラスがたくさんあります。
言い換えれば、サブタイプとしてとFruit
を持つ基本タイプです。サブクラスに設定された識別子の値を取得するプロパティを公開しました。Apple
Pear
type
これでJsonExportService
、インスタンスを JSON データとしてエクスポートする ができました。アプリケーションを実行しているとき、このサービスは識別子の値が入力されたtype
プロパティを正しくエクスポートします。
の単体テストを作成する必要がありJsonExportService
ます。問題は、GrailsDomainBinder
単体テストでモックアウトされていないようで、NPE: cannot access discriminator
property on a null object を取得していることです。
次の 2 つの方法で回避できます。
ディスクリミネータと同じ値を持つ各サブクラスに静的プロパティを作成します。
これは非常にハックに思えますが、2 つの場所で同じ値を宣言しています。
getType()
コードを次のように変更します。これは機能しますが、現在は基本的にディスクリミネーターを完全に無視しており、
getType()
メソッドが正しい値を返すことを確認するためにフォローアップ統合テストが必要なため、単体テストは「完全」ではありません。
ドメイン マッピングから識別子の値を取得する、単体テストに適したより良い方法を知っている人はいますか?
grails - Grails では、永続エンティティのサブタイプを変更することは可能ですか?
次のクラスがあるとします。
ユーザーが新しい を作成したいとしましょうApple
。ドロップダウンから型を選択し、サービスを使用して型文字列を具体的な型に変換します。
Apple
これにより、新しいインスタンスが正常に保存されます。
ここで、ユーザーが間違いを犯したことに気づき、Orange
代わりに を作成したいとしましょう。編集ビューでは、ユーザーがタイプを に変更できるようにしていますが、既存のインスタンスを に変更Orange
するにはどうすればよいですか? 他の関係があるため、単純に を削除して新しいインスタンスを作成することはできません。これは可能ですか?Apple
Orange
Orange
Apple
inheritance - 親クラスをクエリすると、常に空のコレクションが返されます
次のアノテーションを持つ親クラスがあります
これで、すべての子クラスに次のアノテーションが付けられました。ただし、アノテーションのvalue
属性@Discriminator
はもちろん異なり、アノテーションの属性も異なりtable
ます@PersistanceCapable
。
そして、で注釈が付けられたDAOクラスを介して@Persistence
、PoCとして次のメソッドを使用しています
entity-framework - TPTとディスクリミネーターを使用したEntityframework4.3コードファースト
私はこれらの3つのモデルを持っています:
タイトルとタイプが2列の機器のリストを表示したいと思います。
例えば:
機器の識別列を作成して、各機器のタイプを表示する方法がわかりません。
編集済み
機器エンティティに次のような識別器がある場合:
次のように、コントローラーまたはリポジトリーでクエリを取得できます。
inheritance - OpenJPA 結合継承 - データベース結合を避ける
Joined継承戦略でOpenJPAを使用しています(InheritanceType.JOINED-スーパークラスのすべてのフィールドに単一のテーブルがあり、サブクラステーブルには、サブクラスに追加されたすべてのフィールドと、スーパークラスへの参照が含まれていますテーブル)。スーパークラスの Person と、いくつかのサブクラス (TypeAPerson、TypeBPerson など) があるとします。次のようなクエリがある場合:
私の知る限り、Person インスタンスではなく、適切なサブクラス インスタンスを取得します。hereで述べたように、これを達成して適切なサブクラスを取得するために、OpenJPA は複数の結合 (サブクラスごとに 1 つ) を行います。特にサブクラスが多い場合、これはパフォーマンスが非常に悪くなります。私の質問は、JPAに参加するテーブルのヒントを与えることでこれを回避する方法があるかどうかです? 最初に頭に浮かぶのは、Discriminator 値の使用です。OpenJPA は Joined 戦略を持つ Discriminator を持つことをサポートしているので、discriminator の値からサブクラス (したがって、結合するための適切なテーブル) を決定できるはずですか? これを達成する方法はありますか?不要なデータベース結合を回避する他の方法はありますか?
inheritance - JPA 2 マッピング継承タイプ JOINED または SINGLE?
3 つのテーブル/クラス (Language、Caption、CaptionLanguage) を持つテスト ケースがあります。
Language テーブルには、言語データが格納されます。
Caption テーブルには、キャプション インデックス データが格納されます。
CaptionLanguage テーブルには、言語ごとのキャプション データが格納されます。
問題を解決するためにどの継承タイプを使用できますか?
「@DiscriminatorColumn(name="ID_LANG",discriminatorType=DiscriminatorType.Integer)」
を「@Inheritance(strategy=InheritanceType.JOINED)」で設定すると機能しますか?
@DiscriminatorValue(value="Value") を使用しない場合
ありがとう!
hibernate - 2行を結合する休止状態
Java コードを簡単にするために、データを使用するために 2 つの行が存在する必要があるため、2 つの行を 1 つに結合したいと考えています。
それらが私のテーブルのフィールドだとしましょう:
明らかに、ID は主キーです。FIELD1 と 2 により、DISCRIMINATOR と VALUE だけが異なる 2 行の「グループ」を識別できます (識別子は、値が何を表しているかを示します)。
そして、次のように、「グループ」ごとに 1 つの POJO が必要です (ここで、FIELD1 と 2 は複合 ID として使用されます)。
どこ :
VALUE1 = 識別子 A の値
VALUE2 = 識別子 B の値
SQL では、次のようにリクエストします。
残念ながら、休止状態にする方法がわかりません。現在、すべての可能性に混乱しています。
私はソリューションをマッピングされた XML として使用したいと考えていますが、選択の余地がない場合でも注釈ソリューションを使用します。
hibernate - あるサブクラスから別のサブクラスに変更するための最もスマートなアプローチ (識別子の値を更新する)
背景:次のクラスの永続性を実装しています。
class Person
abstract class ContactInfo
Email extends ContactInfo
SnailMail extends ContactInfo
各PersonはContactInfoオブジェクトへの参照を持っています。(また、ContactInfoオブジェクトは複数のPerson間で共有できます。)
私のユーザー インターフェイスでは、ユーザーが連絡先情報オブジェクトを編集できるようにする必要があります。(置き換えられる連絡先情報オブジェクトが複数のユーザーで共有されている場合は、それらすべてのユーザーの連絡先情報が更新されている必要があります。)
しかし、私が理解しているように、Hibernate は識別子列の更新を拒否するため、単純に新しいSnailMailオブジェクトを作成し、置き換えるEmailオブジェクトの主キー値を与えて保存しても機能しません。
質問:ユーザーがContactInfoオブジェクトをEmailからSnailMailに変更できるようにする最善の方法は何ですか?
(オブジェクトは「短命」です。これは Web アプリの一部であり、すべてのオブジェクトは要求ごとに HQL を介して再読み取りされるため、心配する切り離されたオブジェクトは実際にはありません。)
これまでの私の考え:古いオブジェクトを削除して、新しいオブジェクトを挿入できることに気付きました。これが好ましいアプローチである場合、(A) 古い主キー値を再利用するか (この場合、割り当てられたジェネレーターを使用する必要があります)、または (B) バックエンドに新しいオブジェクトの新しい ID を生成させます。個人の連絡先参照を更新して、新しいオブジェクトを指すようにしますか?
(B) が進むべき道である場合、HQL ステートメントを使用して参照の更新を行うことができますか、または影響を受けるすべての人物オブジェクトを「手動で」ロード/更新/保存する必要がありますか?
ef-code-first - Entity Framework Code First: 階層ごとのテーブル、カスタム識別子フィールドに入力しない
Table Per Hierarchy (TPH) アーキテクチャを使用して、既存のデータベース スキーマを操作しています。カスタムDiscriminatorフィールド名を使用しようとすると、 DbEntityValidationException :
プロパティ: CourseType エラー: CourseType フィールドは必須です。