2

CalculatedValue と Price の 2 つのクラスがあります。Price には CalculatedValue のマップがあります。各 CalculableValue インスタンスには、名前、値、およびいくつかの他のフィールドがあります。

Price と CV の間の依存関係を説明するために使用するマッピングを次に示します。

@OneToMany(
        cascade = CascadeType.ALL,
        fetch = FetchType.EAGER
)
@JoinColumn(name = "priceId")
private Map<String, CalculatedValue> calculatedValues =
        new TreeMap<String, CalculatedValue>();

結合テーブルはなく、Price の一意の ID を参照する priceId 列によるマッピングのみです。

生成されたテーブルは次のようになります。

CREATE TABLE PUBLIC.CALCULATEDVALUE ( UNIQUEID BIGINT NOT NULL, KEY VARCHAR(2147483647) NOT NULL, PRICEID BIGINT, VALUE DOUBLE NOT NULL, CALCULATEDVALUES_KEY VARCHAR(2147483647), 主キー (UNIQUEID) );

ALTER TABLE PUBLIC.CALCULATEDVALUE ADD FOREIGN KEY (PRICEID) REFERENCES TEST.PUBLIC.PRICE (UNIQUEID);

すべてが機能していますが、これが可能かどうか知りたいです:

  1. 「CALCULATEDVALUES_KEY」列の自動作成は避けてください。この値はすでに KEY 列に格納されています。重複を避けて何らかの方法で JPA にヒントを与えるとよいでしょう。
  2. 削除された価格ごとに計算可能な値のカスケード削除をトリガーします (SQL 削除ステートメントを実行している場合)
  3. Date をキーとして使用する場合、そのようなマッピングは機能しますか? この特定の分野ではありませんが、他の多くの分野では役に立ちます。同じ OneToMany 関係を想定しています。

前もって感謝します!

PS。データベースとしてEclipseLinkとH2の最新バージョンを使用しています。PPS。Javaでキーを購入する必要があることが多いため、計算可能な値を配列に格納したくありませんでした。

4

1 に答える 1

1

マップの詳細については、以下を参照してください。

http://en.wikibooks.org/wiki/Java_Persistence/OneToMany

と、

http://en.wikibooks.org/wiki/Java_Persistence/Relationships#Maps

と、

http://www.eclipse.org/eclipselink/documentation/2.4/jpa/extensions/a_cascadeondelete.htm#CIABIIEB

いくつかの問題:

  • EclipseLinkはデフォルトでMapにHashtableを使用します。TreeMapを使用する場合は、フィールドをTreeMapとして定義する必要があります。
  • @OneToManyに@JoinColumnを指定しないでください。これは、高度な単方向@OneToManyでのみサポートされます。通常の@OneToManyは、mappedByを使用し、ターゲットエンティティに逆@ManyToOneを含める必要があります。(これにより、重複する外部キーの問題が修正されます)。
  • マップに@MapKeyを指定する必要があります。指定しない場合、デフォルトでidになります。これは、文字列ではなく整数のようです。
  • EclipseLinkで@CascadeOnDeleteを使用して、データベースで削除をカスケードできます。
于 2012-12-11T15:31:24.757 に答える