问题 如何在实体类中添加Map ?


我想添加映射为

Map<String, Person> personMap;

在实体类中,其中 Person 是实体。该 Map 是确切的确定 Person 对应的 String (让它成为那个人的昵称)。同一个人可能有不同的名字,无论何时给出任何名字,都是相同的 Person 必须找到。

使用的Persistance API是JPA,提供者是EclipseLink。我应该使用什么注释以及如何使用?


6500
2017-09-23 06:55


起源



答案:


根据JSR-317的第2.7节,如果Map的值是实体(这是您的情况),则创建连接表,然后应使用OneToMany / ManyToOne注释。

对于密钥,如果它是基本类型,则@MapKeyColumn可用于自定义密钥的映射列。所以这是我对你的例子的看法:

@OneToMany
@MapKeyColumn(name="person_nickname")
Map<String, Person> personMap;

编辑:

经过一些测试,以下似乎工作得很好:

@ElementCollection
@CollectionTable(name="<name_of_join_table>")
@MapKeyColumn(name="<name_of_map_key_in_table>")
Map<String, Person> personMap;

上面生成了一个包含三个字段的连接表:一个用于映射持有者ID,一个用于键,一个用于值。


16
2017-09-23 19:39



效果很好,但是当将映射项目读入Map时,自动提取对我来说不起作用。 - sealskej


答案:


根据JSR-317的第2.7节,如果Map的值是实体(这是您的情况),则创建连接表,然后应使用OneToMany / ManyToOne注释。

对于密钥,如果它是基本类型,则@MapKeyColumn可用于自定义密钥的映射列。所以这是我对你的例子的看法:

@OneToMany
@MapKeyColumn(name="person_nickname")
Map<String, Person> personMap;

编辑:

经过一些测试,以下似乎工作得很好:

@ElementCollection
@CollectionTable(name="<name_of_join_table>")
@MapKeyColumn(name="<name_of_map_key_in_table>")
Map<String, Person> personMap;

上面生成了一个包含三个字段的连接表:一个用于映射持有者ID,一个用于键,一个用于值。


16
2017-09-23 19:39



效果很好,但是当将映射项目读入Map时,自动提取对我来说不起作用。 - sealskej