2

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

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

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

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

以下是生成的表的样子:

创建表 PUBLIC.CALCULATEDVALUE ( UNIQUEID BIGINT NOT NULL, KEY VARCHAR(2147483647) NOT NULL, PRICEID BIGINT, VALUE DOUBLE NOT NULL, CALCULATEDVALUES_KEY VARCHAR(2147483647), PRIMARY KEY (UNIQUEID));

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

一切正常,但我想知道是否有可能:

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

先感谢您!

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

4

1 回答 1

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 对数据库进行级联删除。
于 2012-12-11T15:31:24.757 回答