【问题标题】:Overriding mappings for a map of basic types覆盖基本类型映射的映射
【发布时间】:2012-02-20 09:49:42
【问题描述】:

我正在为我的实习开发 JPA 2.0 合规套件...该套件的一部分正在测试极端案例。

JSR-317 在第 360 页上声明“AttributeOverride 注释可以应用于包含可嵌入类实例的元素集合或 其键和/或值是可嵌入类的映射集合。"

那么,根据 JPA 2.0,我如何覆盖基本类型映射的映射?我知道我可以使用@MapKeyColumn 来映射地图的键,而且我确信也有一些方法可以映射@CollectionTable 的值侧......

但是我将如何覆盖这些?

考虑一个带有地图的@Embeddable

@CollectionTable
@MapKeyColumn(name="differentname_KEY")
Map<Integer, String> testMap;

我将如何覆盖键和值?我是使用@AttributeOverride 还是其他什么? (或者不可能?!)

我在这里假设这样的地图将使用@CollectionTable 进行映射,所以如果我错了,请纠正我。 如果 JPA 没有给出答案,我很想知道持久性提供者是如何解决这个问题的。

编辑: Viruzzo 评论说基本类型是可嵌入类型。 我愿意接受这一点,但有些东西阻碍了我: JSR-317 指的是一个可嵌入的(见上面的引号)。类型和类不一样...

【问题讨论】:

  • 基本类型可嵌入;我会说这只是一个糟糕的词选择。
  • 如果您将其添加为答案,我可以接受...您确定没有区别吗?与我所见的深度有所不同:如果是可嵌入的,它将是 @AttributeOverride(name="embeddable.testMap.key.attribute" [column omitted]),如果是基本类型,它将是 @AttributeOverride(name="embeddable.testMap.key" [column omitted])
  • @MapKeyClass 还声明“映射键可以是基本类型、可嵌入类或实体。”,从而进一步支持可嵌入类型与可嵌入类不同。
  • 我没说它们是一样的,只是基本类型是可嵌入的(不是可嵌入的class);简单地说,可嵌入的 class 是在传递给 JPA 时合并到容器类中的类,这是基本类型的本机(也是唯一)行为。
  • 好的,……这如何回答这个问题?我很难理解。

标签: java annotations jpa-2.0


【解决方案1】:

首先作为旁注:您的示例中的地图甚至不应该编译。原因是 int 是原始类型,java.util.Collection 集合和映射接口和实现仅用于引用类型。

让我们改用下面的例子:

SomeEntity {
  @Id private int id;
  @ElementCollection
  private Map<Integer, String> testmap; 
}

默认情况下,testMap 映射到表SomeEntity_TESTMAP(SOMEENTITY_ID, TESTMAP, TESTMAPKEY)。我们有默认的表名和三个默认的 列名。可以覆盖所有这些。下面将映射到表testmap_table(join_column, value_column, key_column):

@ElementCollection
@CollectionTable(name = "testmap_table", 
                 joinColumns = @JoinColumn(name = "join_column"))
@MapKeyColumn(name = "key_column")
@Column(name= "value_column")
private Map<Integer, String> testMap;

@AttributeOverride 在这里没有用,因为没有键或值是可嵌入的。它用于覆盖从其他地方派生的映射,而不是用于覆盖 ElementCollection 的默认值。它确实有两种用法:

  • 覆盖从映射超类派生的属性映射或 派生自嵌入式类
  • 从可嵌入类派生的覆盖属性映射 在元素集合中用作键或值。

【讨论】:

  • 修复了编译错误,谢谢。我明天上班时会更详细地查看这个...我看到这里不能使用@AttributeOverride - 将使用什么?
  • 用于什么,你能举例说明你错过的功能吗?在示例中,我给出了三列,并且所有列的默认名称都被覆盖(@JoinColumn、MapKeyColumn、@Column)。
  • 映射如何在 SomeEntity 类之外被覆盖(就像@AttributeOverride 的工作原理——从 B 类覆盖 A 类中的映射)
  • 很可能没有办法做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-10
  • 2012-04-14
  • 1970-01-01
  • 1970-01-01
  • 2019-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多