覆盖基本类型映射的映射

时间:2012-01-27 11:38:28

标签: java annotations jpa-2.0

我正在为我的实习制作一个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指的是一个可嵌入的(参见上面的引用)。类型和类别不一样......

1 个答案:

答案 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的默认值。它有两个用法:

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