2012-12-11 73 views
2

我有两个类,CalculatedValue和Price。价格有CalculatedValue的地图。每个CalculableValue实例都有其他字段的名称,值和一对。JPA SortedMap映射 - 避免两列与键

这里是我的映射用来描述价格和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 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. 这样的映射工作,以防万一我将使用日期作为关键?不是针对这个特定的领域,而是针对其他一些领域,这将是有用的。假设相同的OneToMany关系。

提前致谢!

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

回答

1

在Google地图上看到的信息,

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对数据库进行级联删除。
+0

感谢您的回答。 下面是我有它现在描述: 舱位价格: @OneToMany( 级联= CascadeType.ALL, 取= FetchType.EAGER, 的mappedBy = “价格” ) 私人地图<字符串,CalculatedValue > calculatedValues = new TreeMap (); CalculatedValue类: @ManyToOne(取= FetchType.LAZY) @JoinColumn(name = “priceId”) 私人价格的价格; – Val

+0

两个问题: 1)priceId列已生成,但未自动填充。 有什么办法让它自动填充? 我想我需要一些简单的OneToMany + JoinColumn从我的第一个例子,不需要手动填充反向引用。 2)我仍然有自动生成的CALCULATEDVALUES_KEY列。 有没有什么办法可以避免并帮助JPA了解我已经有一个存储在KEY列中的密钥? – Val

+0

试图使用TreeMap而不是Map,并且eclipselink会生成一个错误 - 此映射的属性类与集合类不匹配。 [类java.util.Hashtable]不能被分配给[类java.util.TreeMap]。试图找到什么eclipselink支持,但没有运气的信息......不知道如果我想切换到休眠.. – Val