0

コード ブロックに投稿した複合キーとそれらを使用するエンティティが表示されたら、次の疑似テーブルを参照してください。住所エンティティ用にデータベースに含める必要があります。

アドレス テーブル:

ADDRESS
-------------------------------
DOCUMENTTYPE    INT2         PK
DOCUMENTNR      VARCHAR(10)  PK
ALIAS           VARCHAR(20)  PK
FULLADDRESS     VARCHAR(100)
...

エンティティと複合キー:

@Embeddable
public class Document implements Serializable {
    private DocumentType  documentType;
    private String        documentNr;
    ...

@Entity
@IdClass(Document.class)
public class Person {
    @Id
    private DocumentType  documentType;
    @Id
    private String        documentNr;
    private String        fullName;
    ...

@Embeddable
public class AddressId implements Serializable {
    private DocumentType  documentType;
    private String        documentNr;
    private String        alias;
    ...

@Entity
@IdClass(AddressId.class)
public class Address {
    @Id
    @ManyToOne
    private Person        person;
    @Id
    private String        alias;
    private String        fullAddress;
    ...

注: DocumentTypeenumです。

さて、私はAddressエンティティのマッピングをしようとしていますが、うまくいきません。理由はわかりません。名前と型が一致しないという問題があると (EclipseLink) 言い続けています。AddressId IdClass にエイリアス属性がない場合 (もちろんAddressエンティティもない場合)、完全なAddressId IdClass (エイリアス属性あり) と同様に魅力的に機能するが、EmbeddedId を使用する理由がわかりません. 私が必要とするのは、私が投稿したのと同じようにAddressエンティティを持つことです。

マッピングエラーはどこにありますか?

前もって感謝します!

4

3 に答える 3

0

あなたの質問に直接答えることはできません。ただし、ここに役立つ可能性のある観察があります。

データベース スキーマを Java にマップする前に、データベース スキーマを調整する必要があると思います。以下にいくつかの提案を示します。

1: すべてのデータベース テーブルには 1 つだけの主キー (通常は long 型) が必要であり、主キーにはビジネス上の意味はありません。どこにも複合キーはありません。複合キーがないため、元の問題はもう問題ではありません。

2:主キーは通常、テーブル名の後に ID を付けた名前が付けられます (名前として「ID」だけを使用しないでください)。

例: アドレス addressID long primaryKey

3: 主キーと呼ぶその他のフィールドは、他のテーブルの主キーを参照する外部キー (後に ID を持つ long 型) である必要があります。

4: データベース テーブルを適切に正規化する必要があります。例: 列「fullAddress」は、おそらく、streetAddress、city、stateID、countryID、zipcode に分割する必要があります。別の例: ADDRESS テーブルには住所情報のみを含める必要があります。なぜ DOCUMENTTYPE があるのですか? それは住所と何の関係がありますか?

5: データベースのテーブルと列の名前を明確に理解する必要があります。「DOCUMENTNR」列は、私には何の意味もありません。

6: データベースのテーブルと列は現在のものである必要があり、通常は同じ名前の Java クラスにマップする必要があります。代わりに、明らかに Address データベース テーブルにマップする AddressId というクラスがあります。クラスの名前を Address に変更します。

7: どの列が一意で、NULL 可能でないかを決定する必要があります。

データベース スキーマの作成については、親しみやすい近所のデータベース管理者にお問い合わせください。

于 2013-10-29T17:58:49.657 に答える
0

@Enumerated(EnumType.STRING)自分のenumフィールドに追加する必要があると思います

このような:

@Id
@Enumerated(EnumType.STRING)
private DocumentType  documentType;
于 2013-10-29T15:53:49.570 に答える