2009-05-15 5 views
2

ビジネスキーの一意の番号を生成する最適な方法は何ですか?ビジネスキーを生成

以下の例では、顧客が注文を参照するために使用できる番号(OrderNumber)が必要です。

<class name="Order"> 
    <id name="Id" ... /> 

    <property name="OrderNumber" column="order_number" /> 

</class> 
+0

あなたのIDジェネレータは何ですか?なぜあなたはそれをイドとして使用しないのですか? OrderNumberには何らかの要件がありますか(シーケンシャルなど?) – Rashack

+0

OrderNumberに関するあなたの必要条件は何ですか?それは任意の数値または文字列および数値ですか。 –

+1

OrderNumberは連番でなければなりません。穴は大丈夫です。 IDは、アプリケーションによって割り当てられたGUIDです。主キーとしてビジネス識別子(OrderNumber)を使用することは望ましくありません。 通常のプロパティでnHibernateジェネレータを使用できますか? –

答えて

6

これらのタスクを実行する最善の方法は、コードで記述してデータレイヤーにリークさせないことです。私はNHibernateに計算させません。私は、この概念をアプリケーションの完全な機能として扱います。これはテストを書くことができ、柔軟性があるのでいいです。他のエンティティとの関係のように、次のシーケンス番号を計算する際に他の要因が関係することがあります。クライアント02の場合は02-001,02-002、クライアント01の場合は01-001,01-002の順番で注文することをお勧めします。

したがって、SequneceNumberの概念をドメインモデルオブジェクト、NHibernateでマップし、私の側でロジックを行います。私は新しいものを必要とするたびに、私は

​​

ようになりますインターフェイスを使用して、それは、データベーステーブルに(顧客ごと)1つのレコードに現在のシーケンス番号を管理します。この関数を呼び出すたびに、データベース内のプレースキーパーがインクリメントされ、値が返されます。

工場はこのインターフェイスに依存し、シーケンス番号を必要とするオブジェクトを構築するためにこのインターフェイスを使用します。

+0

大きなポイントMatt。ありがとうございました。 –

+0

これはあなたの*古代の*答えです、私は知っています。しかし、私は多くのアイデアが好きです! SequenceNumberオブジェクト、それに対するマッピングを共有できると思いますか?また、クライアント(すなわち、02)の保存内でトランザクション番号(すなわち、003)をトランザクションに適用する方法...お気軽に – Berryl

+1

@Berryl - 私は行く準備ができていませんが、可能な最も単純なデータ行を想像してくださいFKとint。モデルは、エンティティ参照とintのように見えます。マッピングはまっすぐである。ナンバリングなどのビジネスルールについては、それはまったくユニークなことです。 –

関連する問題