次のように製品の価格設定を実装したいと考えています。
- Product オブジェクトは、現在の価格を表す単一の Pricing オブジェクトを保持します。
- Product テーブルは、1 対多の関係で Pricing テーブルにリンクされています
+------------+ +---------------------+ | | 製品 | | | 価格 | +------------+ 1-n +---------------------+ | | 商品ID | ----------- | 商品ID | | | ... | | | price_id | +------------+ | 価格_値 | | | price_creation_time | | | ... | +---------------------+
これまでのところ単純に聞こえますが、私が問題を抱えている部分は
- 製品には、1 つの有効な価格、つまり最新の価格しかありません。
- 最新のものより前の価格設定レコードは取得しないでください。
- ユーザーが製品の価格設定を編集するとき、現在のレコードは更新されるべきではなく、代わりに現在のタイムスタンプを持つ新しいレコードが挿入されるべきです。
- 以前の価格記録は、履歴上の理由 (顧客が購入時に製品に対して支払った払い戻しを希望するなど) のために保持されます。
基本的に、製品オブジェクト内からは、関係は 1 対 1 の関係であるかのように見える必要があります。ただし、Hibernateを使用してそのようなことを実装する方法がわかりません
1 対多の関係の最後のレコード Hibernate Criteriaは、Criteria と呼ばれるものが役立つ可能性があることを示唆していますが、私は Hibernate の経験がほとんどなく、まだクラス アノテーションを理解しています。
Hibernate とのこのような 1 対 1 の関係のように見えるような 1 対多の関係を実装することは可能ですか? どうすればそれを行うことができますか?
更新: アイデアに関するもう少し詳しい情報は次のとおりです。
領収書は、購入した各アイテムのレコードのコレクションで構成されます。
+--------------+ +------------------+ | | 領収書 | | | 領収書明細 | +---------+ +--------------+ +------------------+ +----- | 製品 | | | レシート ID | ----------- | レシート ID | | | +---------+ | | 受領時刻 | | | 商品ID | ---+ +-------+ | | ... | | | price_id | ----------- | 価格 | +--------------------+ | 商品の数量 | +------+ | | ... | +------------------+
製品には、最新のタイムスタンプを持つ価格テーブルの価格レコードによって決定される現在の価格 (明らかに 1 つの現在の価格のみ) があります。
SELECT *
FROM prices
WHERE product_id = (Product ID goes here)
ORDER BY price_creation_time;
LIMIT 1;
価格を更新するとき、現在製品に関連付けられている価格レコードを更新するのではなく、新しい価格レコードを挿入したい.
INSERT INTO price (
product_id,
price_value,
price_creation_time
) VALUES (
(Product ID goes here),
(New price goes here),
NOW()
);
顧客が何かを購入すると、購入した各アイテムのレシート レコードに行が追加されます。各行は製品の ID で構成され、cut には、領収書が生成された時点で適用可能な価格設定レコードの ID も含まれています。そうすれば、購入時に顧客が製品に支払った金額がわかります。
このデータは、まだ定義されていない会計やその他のデータ マイニング アクティビティにも使用できます。