0

発注書エンティティのストリート、シティとして複合キーが必要だとします。

以下は私がそれをしていることを特定する方法です、

    @Embeddable
    public class BillingAddress implements Serializable {

        private String street;
        private String city;

        public BillingAddress(){

        }

        public BillingAddress(String street, String city) {
            this.street = street;
            this.city = city;
        }
        //with getters and setters
}



@Entity
@IdClass(BillingAddress.class)
public class PurchaseOrder {

    public PurchaseOrder(BillingAddress billingAddress) {
        street = billingAddress.getStreet();
        city = billingAddress.getCity();

    }

    @Id
    @AttributeOverrides({
            @AttributeOverride(name = "street", column = @Column(name = "STREET")),
            @AttributeOverride(name = "city", column = @Column(name = "CITY")) })
    private String street;
    private String city;
    private String itemName;

    public String getItemName() {
        return itemName;
    }

    public void setItemName(String itemName) {
        this.itemName = itemName;
    }

}

@AttributeOverridesアノテーションが実際に何をするのかを理解したいですか?列名をSTREET1に変更しても、列名STREETで作成されたテーブルが表示されます。つまり、column = @Column(name = "STREET"))はここで何をしているのでしょうか。

また、BillingAddressを取得するコンストラクターの代わりに、PurchaseOrderクラスのフィールドのようにすることができます。

 public class PurchaseOrder {
     BillingAddress billingAddress;

}

この場合、これはどのように変化しますか?私はまだプライベートストリングストリートを持っている必要がありますか?プライベートストリングシティ; PurchaseOrderで?

最後に、複合主キーの使用は、データベーステーブルの構造を変更せずにレガシーデータベーステーブルをマッピングするために適用できる新しいデータベースシステム設計では、複合キーの使用を避ける必要があることを読みました。そのステートメントは有効なものですか?

//質問を編集

請求先住所がフィールドにある発注書を保存し、

PurchaseOrder purchaseOrder = new PurchaseOrder();
purchaseOrder.setItemName("name");

BillingAddress billingAddress = new BillingAddress();
billingAddress.setCity("c1"); billingAddress.setStreet("s1");                                                              purchaseOrder.setBillingAddress(billingAddress); 
session.save(purchaseOrder);
4

2 に答える 2

1

あなたが尋ねた質問はほとんどありません。私はそれらすべてを調べて、それぞれに答えようとしました:

@AnnotationOverride は何をしますか?

ここで答えてください: @AttributeOverride とはどういう意味ですか?

2 番目の質問は少しわかりにくいですが、複合キーのすべてのフィールドを PurchaseOrder クラスに含める必要があるかどうかを尋ねていると思います。

いいえ、そうは思いません。これが私が本当に速くまとめた例です:

@Entity
@Table(name = "PURCHASE_ORDER")
public class PurchaseOrder{

    @Id
    private BillingAddress billingAddress;

    //getters & setters

    @Embeddable
    public static class BillingAddress implements Serializable {
        @Column(name = "street")
        private String street;
        @Column(name = "city")
        private String city;
        @Column(name = "itemName")
        private String itemName;

        //getters & setters

    }
}

構文については気にしないでください。構造だけを考えてください。ID ではない追加のフィールドを PurchaseOrder に追加することもできます。

複合キーを使用する必要がありますか?

ここで答えてください:複合主キーを使用する必要がありますか?

于 2013-01-03T07:42:16.857 に答える
0

さて、あなたのPurchaseOrderクラスは、どのような種類のマップされたエンティティからも拡張されません。また、(現在) を適用しているプロパティも拡張しません@AttributeOverride。したがって、実際にオーバーライドするものは何もなく、JPA プロバイダーは単にアノテーションを無視しています。あなたがしようとしていると思うのは、エンティティの埋め込み ID を定義し、その ID の列マッピングの一部をオーバーライドすることです。現在のコードにいくつかの変更を加えることで、これを行うことができます。

@Entity
public class PurchaseOrder {
    @EmbeddedId
    @AttributeOverrides({
            @AttributeOverride(name = "street", column = @Column(name = "BILLING_STREET")),
            @AttributeOverride(name = "city", column = @Column(name = "BILLING_CITY")) })
    private BillingAddress billingAddress;

    private String itemName;

    // Constructors, Getters/Setters
}

現在の例では、埋め込まれた ID 名とオーバーライドされた名前が同じであるため、オーバーライドされた属性の名前を変更したことに注意してください。

于 2013-01-03T02:53:45.490 に答える