次のことを試してください。

私はそれがあなたのすべての設計ポイントをカバーしていると思います。
私はあなたのコメントの行間を読み込もうとしていますが、あなたはいくつかの「ルール」を取得するシステムを実装したいと考えていますReview(私は推測していますが、例として、レビューは最大n行になる可能性があります)。 、ある程度の品質を得る前に、少なくともmが必要です)。 これが実際に当てはまる場合、クラスを作成しました:CustomerReviewsReviewReviewTemplate
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属性に入力します。feedbackScoreReviewTemplate
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をカスタマイズできます。ReviewTemplateReviewLineTemplate
- 時間が経つにつれて、
ReviewTemplateが既に回答した質問を変更することなくReviewLineTemplate、 を更新、編集し、継続的に改善することができます。が直接リンクされている場合、 を編集すると、 が回答した質問が変更され、feedbackScore が黙って無効になります。CustomerCustomerFeedbackScoreReviewLineTemplateReviewLineTemplateCustomer
ReviewLineFeedbackScore はとの間の結合テーブルに移動されましたCustomerReview。
このモデルは完全に非正規化されているため、より「正確」になりますが、GUI の構築が難しくなります。一般的な「最適化」は、以下を導入することです。
- の 10 (たとえば) 列で
ReviewTemplate、を介してReview呼び出されます。reviewLine1reviewLine10
- を介して
CustomerReview呼び出される10 (たとえば) 列。feedbackScore1feedbackScore10
ReviewTemplateLine、ReviewLineおよびCustomerReviewLineテーブルを削除します
そうすることは正規化されておらず、他の一連の問題を引き起こす可能性があります。YMMV