発注書エンティティのストリート、シティとして複合キーが必要だとします。
以下は私がそれをしていることを特定する方法です、
@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);