【问题标题】:JPA SortedMap mapping - avoid two columns with keysJPA SortedMap 映射 - 避免两列有键
【发布时间】:2012-11-28 21:12:11
【问题描述】:

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

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

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

没有连接表,只是通过 priceId 列映射,该列引用 Price 唯一 ID。

生成的表格如下所示:

创建表 PUBLIC.CALCULATEDVALUE ( UNIQUEID BIGINT NOT NULL, 键 VARCHAR(2147483647) 非空, 价格昂贵的大整数, 值双非空, CALCULATEDVALUES_KEY VARCHAR(2147483647), 主键(唯一标识) );

更改表 PUBLIC.CALCULATEDVALUE 添加外键(PRICEID) 参考 TEST.PUBLIC.PRICE (UNIQUEID);

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

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

提前谢谢你!

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

【问题讨论】:

    标签: jpa eclipselink treemap


    【解决方案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 对数据库进行级联删除。

    【讨论】:

    • 感谢您的回答。这是我现在描述的方式: Price class: @OneToMany( cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "price" ) private Map computedValues = new TreeMap( ); CalculatedValue 类:@ManyToOne(fetch=FetchType.LAZY) @JoinColumn(name="priceId") private Price price;
    • 两个问题:1)priceId列生成了,但是没有自动填充。有没有办法让它自动填充?我想我需要像我的第一个示例中的 OneToMany + JoinColumn 这样简单的东西,而无需手动填充反向引用。 2)我仍然有自动生成的 CALCULATEDVALUES_KEY 列。有什么方法可以避免并帮助 JPA 了解我已经在 KEY 列中存储了一个密钥?
    • 尝试使用 TreeMap 代替 Map 并且 eclipselink 生成错误 - 此映射的属性类与集合类不匹配。 [class java.util.Hashtable] 不能分配给 [class java.util.TreeMap]。试图找到有关 eclipselink 支持的信息,但没有运气...不确定我是否要切换到休眠状态..
    • 似乎 EclipseLink 只是使用 Hashtable 来处理您在声明字段时指定的任何地图。为了提示我想使用什么是确切的集合类,我使用了 DescriptorCustomizer 扩展点。代码看起来像这样 mapping.useMapClass(TreeMap.class, methodName)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-10
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 2016-12-13
    • 2019-02-04
    相关资源
    最近更新 更多