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")) 在这里做什么。

此外,我可以像 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);
4

2 回答 2

1

你问的问题很少,我试图通过所有这些问题并回答每个问题:

@AnnotationOverride 有什么作用?

在这里回答:@AttributeOverride 是什么意思?

第二个问题对我来说有点不清楚,但我想您是在问是否必须在 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

    }
}

不用担心语法,只需担心结构。您甚至可以在 PurchaseOrder 中添加额外的字段,这不是 id。

我应该使用复合键吗?

在这里回答:我应该使用复合主键吗?

于 2013-01-03T07:42:16.857 回答
0

好吧,您的PurchaseOrder类没有从任何类型的映射实体扩展,您(当前)应用@AttributeOverrides 的属性也没有。因此,实际上没有什么可以覆盖,您的 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 回答