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