JPA SortedMap映射 - 避免使用两列键

时间:2012-12-11 10:22:39

标签: jpa eclipselink treemap

我有两个类,CalculatedValue和Price。 Price有CalculatedValue的地图。每个CalculableValue实例都有名称,值和其他几个字段。

这是我用来描述Price和CV之间的依赖关系的映射:

@OneToMany(
        cascade = CascadeType.ALL,
        fetch = FetchType.EAGER
)
@JoinColumn(name = "priceId")
private Map<String, CalculatedValue> calculatedValues =
        new TreeMap<String, CalculatedValue>();

没有联接表,只是通过priceId列进行映射,该列引用价格唯一ID。

以下是生成表的外观:

CREATE TABLE PUBLIC.CALCULATEDVALUE(     UNIQUEID BIGINT非空,     KEY VARCHAR(2147483647)NOT NULL,     PRICEID BIGINT,     VALUE DOUBLE NOT NOT NULL,      CALCULATEDVALUES_KEY VARCHAR(2147483647),     主要钥匙(UNIQUEID) );

ALTER TABLE PUBLIC.CALCULATEDVALUE     添加外键(PRICEID)     参考文献TEST.PUBLIC.PRICE(UNIQUEID);

一切正常,但我想知道是否可以这样做:

  1. 避免自动创建“CALCULATEDVALUES_KEY”列。我已经将这个值存储在KEY列中,这样可以避免重复并以某种方式给JPA提示。
  2. 触发级联删除每个已删除价格的可计算值(如果我正在运行SQL删除语句)
  3. 如果我使用Date作为密钥,这样的映射是否会起作用?不适用于这个特定领域,但对于其他一些领域,它将是有用的。假设同一个OneToMany关系。
  4. 提前谢谢!

    PS。我正在使用最新版本的EclipseLink&amp; H2作为数据库。 PPS。不想将可计算的值存储在数组中,因为我需要经常在Java中找到它的购买密钥。

1 个答案:

答案 0 :(得分:1)

有关地图的信息,请参阅

http://en.wikibooks.org/wiki/Java_Persistence/OneToMany

http://en.wikibooks.org/wiki/Java_Persistence/Relationships#Maps

http://www.eclipse.org/eclipselink/documentation/2.4/jpa/extensions/a_cascadeondelete.htm#CIABIIEB

一些问题:

  • EclipseLink默认使用Hashtable作为Map,如果你想让它使用TreeMap,你需要将该字段定义为TreeMap。
  • 不要在@OneToMany上提供@JoinColumn,这仅支持高级单向@OneToMany,普通的@OneToMany应该使用mappedBy并且在目标实体中具有反向@ManyToOne。 (这将解决您的重复外键问题。)
  • 您需要为地图指定@MapKey,否则默认为id,这里似乎是一个整数,而不是字符串。
  • 您可以在EclipseLink中使用@CascadeOnDelete来对数据库进行级联删除。