【问题标题】:How to mapping the relationship Store <- Stock -> Product with OpenJPA?如何使用 OpenJPA 映射关系 Store <- Stock -> Product?
【发布时间】:2014-07-10 18:03:41
【问题描述】:

我有下一段感情:

目前,我有下一个代码:

@Embedded
public class StockPK implements Serializable {

    private int storeId;

    private int productId

}

@Entity
public class Stock implements Serializable {

    @EmbeddedId
    private StockPK id;

    private int cantidad;

    @ManyToOne
    private Store store;

    @ManyToOne
    private Product product;

}

但是生成的 DDL(我在 TomEE 中使用 OpenJPA)添加了两个附加字段。

CREATE TABLE STOCK (
    productId  INTEGER NOT NULL,
    storeId    INTEGER NOT NULL,
    quantity   INTEGER NOT NULL,
    PRODUCT_ID INTEGER         ,
    STORE_ID   INTEGER         ,
    PRIMARY KEY (productId, storeId)
)

应该如何指定这种关系?

【问题讨论】:

  • docs.oracle.com/javaee/6/api/javax/persistence/MapsId.html。但我强烈建议您避免使用复合主键,并向您的 Stock 实体添加自动生成的 ID。
  • @JBNizet 谢谢。但是...如何避免与您的提案重复?
  • 通过在(storeId, productId)上添加唯一约束。
  • @JBNizet 我正在使用 MySQL。如果我使用复合主键,对性能有影响吗?以另一种方式,使用MapsId 有效。谢谢!
  • 单个数字键上的索引比两个键上的索引快。但主要缺点不是性能。这是可用性。

标签: java sql mapping jpa-2.0 openjpa


【解决方案1】:

感谢 JBNizet :) — 解决方案如下:

@Embeddable
public class StockPK implements Serializable {

    @Column(name = "store_id")
    private int storeId;

    @Column(name = "product_id")
    private String productId;

    // Getters, setters, hashCode, equals

}
@Entity
@Table(name = "stock")
public class Stock implements Serializable {

    @EmbeddedId
    private StockPK id;

    @MapsId("storeId")
    @ManyToOne
    private Store store;

    @MapsId("productId")
    @ManyToOne
    private Product product;

    @Column(nullable = false)
    private int quantity;

    // Getters, setters

}
@Entity
@Table(name = "store")
public class Store implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    // Other fields, getters, setters ...

}
@Entity
@Table(name = "product")
public class Product implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    // Other fields, getters, setters ...

}

【讨论】:

    猜你喜欢
    • 2017-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    • 2012-11-23
    • 1970-01-01
    • 2011-12-01
    • 1970-01-01
    相关资源
    最近更新 更多