問題タブ [composite-key]
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.
java - Efficient HashMap retrieval with key composite key (build from 2 enums)
I have a 2 enum values representing a mapping to object which I'm (currently) modeling with a HashMap with the 2 enums values are used as key and the object is the value.
This is inefficient because what I'm doing is creating a new CompositeKey(Enum1 enum1, Enum2 enum2) for each combination of the Enum1.values() x Enum2.values().
I would like to skip the new CompositeKey() issue.
The solution I'm currently think of is Calculation a number representations of from the 2 enums, something like int numericKey = enum1.ordinal() * 0xFFFF + enum2.ordinal();
but then when I'll do map.get(numricKey)
I will still be auto boxing to Integer - hence creation new instances.
A perfect solution (IMO) would be Map implementation (doesn't have to be generic...) but I don't think such existing for java.
Another option is probably mapping = new Object[Enum1.values().length][Enum2.values().length]
which I will then do lookup with Object = mapping[enum1.ordinal()][enum2.ordinal()]
but that seems a bit too "C'ish".
Anyways, runtime performance is the most important aspect here.
Comments are welcome.
Thanks, Maxim.
nhibernate - NHibernate の複合外部キーで複合主キーの一部を使用する
他のすべてのテーブルがその主キーの一部を継承する単一の「ベーステーブル」を使用して、ほぼ完全に複合主キーと複合外部キーを使用するかなり大きなDB(〜200テーブル)があります。
- 親には単一列の主キー ParentId があります
- 子には複合主キー (ParentId、ChildId) と外部キー ParentId があります
- Nephew には複合主キー (ParentId、NephewId)、外部キー ParentId および外部キー (ParentId、ChildId) があります。
等々。これまでは、独自の ORM フレームワークでこのシバン全体を管理していましたが、学習するように割り当てられた NHibernate の使用を検討しています (v2.1.2 をダウンロードしました)。
マッピング: 子
甥
必要に応じて、クラスも投稿できます。簡潔にするために、ここでは省略します (問題がないため、親のマッピングは省略します)。すべてのプロパティは仮想であり、すべてのマッピング ファイルは埋め込みリソースであり、すべての複合 ID には、Equals と GetHashCode をオーバーライドする独自のクラスがあります。
問題は、単純に初期化new Nephew()
され、に渡された Nephew のインスタンスを保存できない_session.Save()
ことSystem.IndexOutOfRangeException: Invalid index n for this SqlParameterCollection with Count=n.
です。
マッピングで重複する唯一の列はParentId
. のマッピング、およびすべての関連プロパティのmany-to-one
マッピングを削除すると、すべて正常に機能します。Nephew
set
Child
この例外を報告するいくつかの投稿を見つけました。私の場合、最も適切なのはthis oneのようです。これにより、現在のスキーマは NHibernate では実行不可能であるという直感が得られます。私が間違っていると教えてください:-)
ノート:
- 私は現在 Fluent を使用していませんが、それはオプションかもしれませんが、最初に基本を学ぶことを好みました。
- はい、複合主キーが厄介な問題であることは認識しています。この DB は何年にもわたって数人の手を経てきましたが、おそらくそれほど熟練した人ではありませんが、リファクタリングする前に 10 000 に数えます
nhibernate - NHibernate:複合キーの多対1マッピング:プロパティを解決できません(外部キーコンポーネント)
誰もが助けてくれることを願っています。私はこのサードパーティのデータベースに対して開発する必要があり、私は彼らのくだらないデザインに固執しています。それでも、NHibernateを使用したいので、フープを飛び越えなければなりません。
簡略化すると、「Transportation」テーブルの関係を持つこの「Event」テーブルがあります。トランスポートテーブルには、フィールド「ID」と「FK_EventID」で構成される複合主キーがあります。後者はもちろん、イベントレコードを参照します。各イベントは、輸送テーブル内の1つの別個のレコードを指しているため、実際には1対1の関係になります。どちらのフィールドもGuidsBTWです。
これをマッピングしようとすると、これがクラスの作成方法です(簡単にするために他のデータフィールドは省略します)。
と:
マッピングファイルで私はこれを試みています(私は多対1を使用していることに注意してください):
と:
これを実行しようとすると、次の例外メッセージが表示されます。
NHibernate.QueryException:プロパティを解決できませんでした:FK_TransportationID of:FcoLib.FcoEvent
私の最初の予感は、フィールド名にスペルミスがあるかもしれないということでしたが、それは当てはまりませんでした。だから今、私は完全に困惑していて、どのように進めるかがわかりません。どんな助けでも大歓迎です。Thnx。
アップデート
エラーの原因を見つけたと思います。マッピングエラーだと思っていたので、まだ調べていませんでしたが、クエリエラーのようです。これは、クエリを実行する場所で発生します。
これについてさらに詳しく調べますが、明らかに別の方法でこれを照会する必要があります...
java - 複合キー内で生成された値を使用するにはどうすればよいですか?
多対 1 の関係を持つ 2 つのクラス documentlog と documentversion (主キー: int doc_id と int docVersionID) があります。CompundKey という複合キー クラスを使用して、複合主キーを管理しました。docversionID を自動インクリメントする必要がありますが、それができません。この点で私を助けていただけますか?
hibernate - Hibernate は重複する外部キーを処理できるようにする必要がありますか?
2 つの異なるテーブルへの 2 つの外部キーを持つテーブルがあり、両方の外部キーが 1 つの列を共有しています。
ご覧のとおり、country_code を共有する 2 つの FK があります (偶然にも、参照パスの最後で同じ列を参照しています)。エンティティ クラスは次のようになります (JPA 1.0 @IdClass):
ご覧のとおり、countryCode プロパティと都市の国コード @JoinColumn に読み取り専用のフラグを付けました (挿入可能 = false、更新可能 = false)。Hibernate は次のことわざで失敗します。
これは正直なところ、私にはかなり基本的に見えます。「プロパティに挿入可能な列と挿入できない列を混在させることは許可されていません」というのは、弱い「言い訳」ですよね。
たとえばJPA仕様に従って、Hibernateはこれを処理できるはずですか?これはバグですか?
entity-framework - Entity Framework -- 複合キー エンティティをカスケード削除するときに、プリンシパル オブジェクトの前に依存オブジェクトが削除されない
複合キーを持つ依存オブジェクトのカスケード削除に問題があります。具体的には、EF によって発行された SQL 命令は、依存エンティティの前に主エンティティを削除しようとします。
OnDelete="Cascade"
EF モデルの CSDL と SSDL の両方を設定し、従属エンティティをメモリに明示的に読み込んでいるため、EF はそれらを処理することができます。これは別の FK リレーションシップで正しく機能しており、EF は原則を削除する前に子エンティティを正しく削除します。
ただし、この場合はそうではなく、依存エンティティに複合キーがあるためだと思われます。スキーマを簡単に見てみましょう。
エンティティ A を削除すると、エンティティ A_B のエントリも削除されます。
ObjectStateManager を調べると、A の A_B エンティティがメモリに読み込まれ、削除対象としてマークされていることがわかりますが、EF は、 A_B を削除する前にA を削除する SQL コマンドを発行します。これは、依存エンティティが独自の PK を持っている場合は正常に機能しますが、複合キーの場合はうまくいかないようです。削除をカスケードする必要があることを EF の FK アソシエーション (SSDL と CSDL の両方) に明示的に伝えても、最初に子を削除しません。
ここでも、A とその A_B の両方がメモリにロードされており、ObjectStateManager はそれらをすべて削除するようにマークしています。プロキシ作成を有効にして POCO を使用していますが、Context に対する LoadProperty 呼び出しを介して子エンティティをメモリに明示的にロードしています。
誰もこれを見たことがありますか?複合キーが本当に問題なのか、それとも単なる気晴らしなのか? あるケースでは EF が SQL コマンドを正しい順序で処理し、別のケースでは処理しないのはなぜですか?
編集: OnDelete ( http://msdn.microsoft.com/en-us/library/cc716734.aspx ) と Relationship Management ( http://msdn.microsoft.com/en-us/ ) の両方のドキュメントを読みました。ライブラリ/ee373856.aspx )。「識別関係と非識別関係に関する考慮事項」というタイトルのセクションは、私がやりたいことが可能であり、実際に期待されていることを暗示しているようです。おそらく、データベースの EF プロバイダー アセンブリ内の何かでしょうか? 私は、SQL Server データベースではなく、IBM.Data.DB2 アセンブリを使用して Informix データベースに対して作業しています。
(さらなる更新: IBM DB2 v9.7fp3a および EF Providers Beta Refresh に更新しました -- http://www.ibm.com/developerworks/forums/thread.jspa?threadID=345634&tstart=0 )
database - データベース内の複合キーの属性の1つを照会します
複合キーには、col1とcol2の2つの列が含まれています。col1のみでクエリを実行した場合、インデックスは使用されますか?なぜ
通常、インデックスはB+ツリーとして実装されているためです。また、B +ツリーでは、キーは内部ブロックに格納され、すべてのレコードはツリーの最下位レベルに格納されます。インデックスからクエリを実行する場合、効率的または不可能な場合があります。
jpa - JPA、外部キーとシーケンス番号を含む代理キーの混合
私は2つのテーブルを持っています:
データベースのエントリは次のようになります。
書類:
セクション:
Document
DOC_ID に生成された Id があり、Section
DOC_ID と SECTION_NUM に複合主キーがあります。
SECTION_NUM は、ローカル (アプリケーション) で生成されたシーケンス番号で、ドキュメントごとに新たに開始されます。
私のエンティティクラスは次のようになります。
新しいドキュメントと関連するセクションを挿入するときは、次のようにします。
永続化すると、列 SECTION_NUM に NULL は許可されていないという例外が発生します。私は OpenEJB (単体テストのために舞台裏で OpenJPA に依存している) を使用しており、OpenJPA コードをステップ実行すると、Document オブジェクトが正常に永続化されることがわかりましたが、Section オブジェクトになると、新しいインスタンスが反射的に作成され、すべてが設定されます。 fields が null に設定されるため、sectionNum の値が失われ、Document オブジェクトにリンクする前に保持されます。
残念ながら、レガシー システムであるため、DB スキーマを変更することはできません。誰かが似たようなことをして、それを機能させましたか?
datanucleus - Datanucleus fetchgroup 複合キー
datanucleus で複合キーを使用してクラスをマップしようとしています。主キーは 2 つの外部キーで構成されており、これらの外部クラスを fetchgroup に含めることができないようです。
注釈の使用:
作品
作品
しかし
ではない。
どうすればいいですか?
oracle - Nhibernate での複合主キーと外部キー リレーションのマッピング
私が働いている会社はERPを使用しており、そのレガシーデータベースはOracleです。今まではパッケージ (オラクルのストアド プロシージャ) を使用してデータにアクセスしていましたが、年々数が増え続け、今では管理できなくなりました。
私は Nhibernate でいくつかの実験をしようとしていて、いくつかのテーブルのマッピングを開始しました。
すべてのテーブルに複合主キーがあります。簡単な説明:
テーブルオーダー (テーブル名: OCSAORH )
OCHORDN ( PK ) => 注文
番号 OCHAMND ( PK )
OCHCOSC ( PK ) => 会社
OCHCLII
...
テーブル OrderLine (テーブル名: OCSALIN )
OCLORDN ( PK ) => 注文
番号 OCLAMND ( PK )
OCLCOSC ( PK ) => 会社
OCLLINN ( PK ) => 明細番号
OCLSSEQ ( PK )
OCLITMN
...
これが私のマッピングです
注文:
オーダーライン:
これらのマッピングを使用すると、すべてが正常に機能します。注文を読み込むことができ、遅延読み込みによって明細が読み込まれます。いくつかのドキュメントを読んでいるときに、多対 1 の関係を定義していないことに気付いたので、これを追加しました。
OrderLine マッピング ファイルに追加します。
テスト アプリを実行すると、注文は正しく読み込まれますが、注文明細行は読み込まれません。{NHibernate.ADOException} = {"could not initialize a collection: ... }
が
発生しました。調査を試みたところ、行を取得するために生成されたクエリが間違っていることがわかりました。これが SQL です。
お気づきのように、select の最後の 3 つのフィールド (OCL ではなく OCH というプレフィックスが付いたフィールド) は、OCSALIN テーブルのメンバーではありません。それらは OCSAORH のキーです。
ドキュメントと例を読んで1日過ごした後、何が間違っているのかわかりません。
助けようとする人はいますか?