次のことを試してください。
私はそれがあなたのすべての設計ポイントをカバーしていると思います。
私はあなたのコメントの行間を読み込もうとしていますが、あなたはいくつかの「ルール」を取得するシステムを実装したいと考えていますReview
(私は推測していますが、例として、レビューは最大n行になる可能性があります)。 、ある程度の品質を得る前に、少なくともmが必要です)。 これが実際に当てはまる場合、クラスを作成しました:CustomerReviews
Review
ReviewTemplate
ReviewTemplate
必要な値ごとに属性/列があります。これらの属性/列は複製されていますReview
- いくつ
ReviewTemplate
かの行を入力してから、行を作成しCourse
て 1 つにリンクしますReviewTemplate
Course
が を必要とする場合、フィールドを からReview
にコピーReviewTemplate
します。Review
- Java では、上の値ではなく、コピーされた値
Review
を使用するためのビジネス ルールを実装します。ReviewTemplate
値をコピーする理由 ユーザーがテーブルを編集したくなる時が来ると思いReviewTemplate
ます。もしそうならReview
、編集された を使用しているオブジェクトはどうなりますReviewTemplates
か? 変更された値はReviewTemplate
何らかの形で過去を無効にReviews
し、ビジネス ロジックを壊しますか? いいえ、ルール値を にコピーしたReview
ため、過去Reviews
は変更されません。
編集:特定の質問への回答
複製をどのように見ていますか?指定された属性を持つエンティティ ReviewTemplate を作成できます。このエンティティには、reviewlines および feedbackscores との関係があります。
私は、それぞれReviewTemplate
が の特定の「タイプ」のプロトタイプ値を保持してReview
いると考えています。これには、デフォルトの reviewLine (意味がないかもしれません) とデフォルトの feedbackScore が含まれている可能性があります。を作成するときReview
は、次のことを行います。
- をインスタンス化し、
Review
値を入力しますReviewTemplate
CustomerReview
必要な数のオブジェクトをインスタンス化し、それらを関連するCustomer
オブジェクトにリンクします (この手順は、以前のコメントから推測します。ユーザーがCustomer
自発的にレビューすることを選択するまで、この手順を省略することも理にかなっていますCourse
) 。
- (該当する場合)からのデフォルト値を
CustomerReview
属性に入力します。feedbackScore
ReviewTemplate
CustomerReviewLine
必要に応じてレコードをインスタンス化する
このアプローチに従えば、 と の間に関係を追加する必要はありませReviewTemplate
んCustomerReviewLines
。
たとえば、顧客 1 ~ 4 がレビューに記入する必要があると述べた場合、情報を保持する 4 つの特定の「オブジェクト」を作成する必要があり、必要なレビューラインとフィードバックスコアの 4 つのセットを作成して、すべての顧客が情報を保持できるようにする必要があります。 .
絶対。
これを実装する方法がわからないのはJPA構造であるため、情報はデータベースに保持されます...?
JPA ではさまざまな方法で問題に対処できますが、ベスト プラクティスは、DB スキーマと Java クラスの両方を手動で作成することです (例: https://stackoverflow.com/a/2585763/1395668を参照)。したがって、図のエンティティごとに、次のことを行う必要があります。
- SQL DDL ステートメントを記述して、テーブル、列、主キー、および外部キーを作成します。
@entity
アノテーションで示される Java クラスを記述します。クラス内では、id (主キー) に注釈を付け、or@id
との関係にも注釈を付ける必要があります(同様に設定する注釈の追加パラメーター)。@OneToMany
@ManyToOne
JPA 側では、次のようなことができます。
ReviewTemplate template = course.getReviewTemplate(); //assuming the variable course
Review review = new Review();
review.setCourse(course);
review.setRuleOne(template.getRuleOne());
// Copy other properties here
EntityManager em = // get the entity manager here
em.persist(review);
// Assume a set or list of customers
for (Customer customer : customers) {
CustomerReview cr = new CustomerReview();
cr.setReview(review);
cr.setCustomer(customer);
cr.setFeedbackScore(template.getDefaultFeedbackScore());
// set other CustomerReview properties here
em.persist(cr);
// You can create CustomerReviewLine here as well
標準の EJB セッション Bean 内に記述した場合、これはすべて適切に処理され、すべての新しいレコードが DB にコミットされます。
編集 2: 追加の質問
(私は、2 番目のコメントが最初のコメントに完全に取って代わると仮定しています)
そのため、reviewtemplate を作成して多数の顧客にリンクするときは、テンプレートをデータベースに書き込み、テンプレートに基づいて多数のレビューを作成しますが、特定の顧客にリンクし、独自のレビューラインとフィードバックスコアを使用します。私が今見ているように、レビューライン(より質問または説明)は(テンプレートの)各レビューで同じです。顧客間で変化するのはスコアのみです
やっとわかった気がするReviewLine
。Customer
を構成するテキスト行を入力する場所だと思っていましたCustomerReview
。私は今、それReviewLine
が特定の質問でありCustomer
、Customer
フィードバックスコアを提供すると信じています。
この理解に基づいて、更新された ER/クラス図を次に示します。
いくつかの重要な変更があることに注意してください - さらにいくつかの表があります:
ReviewLineTemplate
テンプレートの質問をReviewTemplate
がReview
インスタンス化/挿入されると (これは特定の のコピーですReviewTemplate
)、 はReviewLineTemplates
としてコピーされReviewLines
ます。コピー操作では、次の 2 つの重要な機能が使用できます。
- 作成時に、またはに影響を与えずに
Review
とそのReviewLines
をカスタマイズできます。ReviewTemplate
ReviewLineTemplate
- 時間が経つにつれて、
ReviewTemplate
が既に回答した質問を変更することなくReviewLineTemplate
、 を更新、編集し、継続的に改善することができます。が直接リンクされている場合、 を編集すると、 が回答した質問が変更され、feedbackScore が黙って無効になります。Customer
CustomerFeedbackScore
ReviewLineTemplate
ReviewLineTemplate
Customer
ReviewLine
FeedbackScore はとの間の結合テーブルに移動されましたCustomerReview
。
このモデルは完全に非正規化されているため、より「正確」になりますが、GUI の構築が難しくなります。一般的な「最適化」は、以下を導入することです。
- の 10 (たとえば) 列で
ReviewTemplate
、を介してReview
呼び出されます。reviewLine1
reviewLine10
- を介して
CustomerReview
呼び出される10 (たとえば) 列。feedbackScore1
feedbackScore10
ReviewTemplateLine
、ReviewLine
およびCustomerReviewLine
テーブルを削除します
そうすることは正規化されておらず、他の一連の問題を引き起こす可能性があります。YMMV