我有两个类,CalculatedValue和Price . Price有CalculatedValue的 Map . 每个CalculableValue实例都有名称,值和其他几个字段 .
这是我用来描述Price和CV之间的依赖关系的映射:
@OneToMany(
cascade = CascadeType.ALL,
fetch = FetchType.EAGER
)
@JoinColumn(name = "priceId")
private Map<String, CalculatedValue> calculatedValues =
new TreeMap<String, CalculatedValue>();
没有连接表,只是通过priceId列进行映射,该列引用Price Unique 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 ADD FOREIGN KEY(PRICEID)REFERENCES TEST.PUBLIC.PRICE(UNIQUEID);
一切正常,但我想知道是否有可能:
-
避免自动"CALCULATEDVALUES_KEY"列创建 . 我已将此值存储在KEY列中,这样可以避免重复并以某种方式给JPA提示 .
-
触发级联删除每个已删除价格的可计算值(如果我正在运行SQL删除语句)
-
如果我将Date用作关键字,这样的映射是否会起作用?不适用于这个特定领域,但对于其他一些领域,它将是有用的 . 假设同一个OneToMany关系 .
先感谢您!
PS . 我使用最新版本的EclipseLink和H2作为数据库 . PPS . 不想将可计算的值存储在数组中,因为我需要经常在Java中找到它的购买密钥 .
1 回答
有关 Map 的信息,请参阅
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 . (这将解决您的重复外键问题) .
您需要为 Map 指定@MapKey,否则默认为id,这里似乎是一个整数,而不是字符串 .
您可以在EclipseLink中使用@CascadeOnDelete在数据库上级联删除 .