假设我想要一个复合键作为采购订单实体的街道、城市。
以下是我如何识别它,
@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")) 在这里做什么。
此外,我可以像 PurchaseOrder 类的字段一样拥有它,而不是使用 BillingAddress 的构造函数,
public class PurchaseOrder {
BillingAddress billingAddress;
}
在这种情况下,这将如何改变?我还需要私人字符串街吗?私人字符串城市;在采购订单中?
最后我读到在新的数据库系统设计中应该避免使用复合键,使用复合主键适用于在不改变数据库表结构的情况下映射遗留数据库表的情况,对吗?该声明是否有效?
//编辑问题
保存账单地址在字段中的采购订单,
PurchaseOrder purchaseOrder = new PurchaseOrder();
purchaseOrder.setItemName("name");
BillingAddress billingAddress = new BillingAddress();
billingAddress.setCity("c1"); billingAddress.setStreet("s1"); purchaseOrder.setBillingAddress(billingAddress);
session.save(purchaseOrder);