我有两个类,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);
一切工作,但我想知道是否可以这样:
- 避免自动“CALCULATEDVALUES_KEY”栏目创作。我已经将这个值存储在KEY列中,并且避免重复并以某种方式向JPA提供提示会很好。
- 触发级联删除每个删除价格的计算值(如果我正在运行SQL删除语句)
- 这样的映射工作,以防万一我将使用日期作为关键?不是针对这个特定的领域,而是针对其他一些领域,这将是有用的。假设相同的OneToMany关系。
提前致谢!
PS。我使用最新版本的EclipseLink & H2作为数据库。 PPS。不想将可计算值存储在数组中,因为我需要经常在Java中找到它的购买密钥。
感谢您的回答。 下面是我有它现在描述: 舱位价格: @OneToMany( 级联= CascadeType.ALL, 取= FetchType.EAGER, 的mappedBy = “价格” ) 私人地图<字符串,CalculatedValue > calculatedValues = new TreeMap(); CalculatedValue类: @ManyToOne(取= FetchType.LAZY) @JoinColumn(name = “priceId”) 私人价格的价格; –
Val
两个问题: 1)priceId列已生成,但未自动填充。 有什么办法让它自动填充? 我想我需要一些简单的OneToMany + JoinColumn从我的第一个例子,不需要手动填充反向引用。 2)我仍然有自动生成的CALCULATEDVALUES_KEY列。 有没有什么办法可以避免并帮助JPA了解我已经有一个存储在KEY列中的密钥? – Val
试图使用TreeMap而不是Map,并且eclipselink会生成一个错误 - 此映射的属性类与集合类不匹配。 [类java.util.Hashtable]不能被分配给[类java.util.TreeMap]。试图找到什么eclipselink支持,但没有运气的信息......不知道如果我想切换到休眠.. – Val