当前位置: 首页 > 知识库问答 >
问题:

如何定义地图上的MapKey列名

卫甫
2023-03-14

简短版本:
我正在尝试创建:

@ElementCollection
private Map<String, Item> items;

,其中项目是可嵌入的,并且能够定义在项目表中为地图键创建的列名。Hibernate版本:5.0.12。最终的

完整解释:
以下是一个简化的示例,它再现了我的问题。我的出发点是@EmbedableList

@Entity
public class Root {
    @Id
    private Long code;   

    private String value;    

    @ElementCollection
    private Set<Item> items;
}
@Embeddable
public class Item {
    private String keyValue;    
    private String otherValue;
}

通过此映射,hibernate创建以下表:

create table root (
    code int8 not null,
    value varchar(255),
    primary key (code)
);

create table root_items (
    root_code int8 not null,
    key_value varchar(255),
    other_value varchar(255)
);

alter table root_items 
    add constraint FK1o7au7f9ccr8144vyfgsr194v 
    foreign key (root_code) 
    references root;

到目前为止还不错。接下来,我尝试将列表转换为映射,并使用项。keyValue作为地图的键:

@Entity
public class Root {
    @Id
    private Long code;

    private String value;

    @ElementCollection
    private Map<String, Item> items;
}
@Embeddable
public class Item {
    private String otherValue;
}

它可以工作,但在root\u items表中,映射的键列始终称为items\u key,我无法找到如何将此名称强制为key\u值。

我尝试了以下几种选择:

@ElementCollection
@MapKeyJoinColumn(name = "keyValue")
private Map<String, Item> items;


/* @MapKey doesn't work at all. 
    org.hibernate.AnnotationException: Associated class not found: com.demo.Item
        at org.hibernate.cfg.annotations.MapBinder.bindKeyFromAssociationTable(MapBinder.java:116)
*/
@ElementCollection
@MapKey(name = "keyValue")
private Map<String, Item> items;

@ElementCollection
@CollectionTable(joinColumns = @JoinColumn(name = "code"))
@MapKeyJoinColumn(name = "keyValue")
private Map<String, Item> items;

@ElementCollection
@JoinColumn(name = "keyValue")
private Map<String, Item> items;

@ElementCollection
@CollectionTable(joinColumns = @JoinColumn(name = "code"))
@MapKeyJoinColumn(name = "keyValue")
@Column(name = "keyValue")
private Map<String, Item> items;

但列名始终生成为items\u key:

create table root_items (
    code int8 not null,
    other_value varchar(255),
    items_key varchar(255) not null,
    primary key (code, items_key)
);

我还尝试了上述所有组合,将键值保留在项目中,但我只得到和额外的列:

create table root_items (
    code int8 not null,
    key_value varchar(255),
    other_value varchar(255),
    items_key varchar(255) not null,
    primary key (code, items_key)
);

我发现了类似的问题,但没有解决我的问题:

>

钥匙

是否有强制列名为某个自定义值?

编辑1:我发现如果map键是可嵌入的,那么我就可以实现它。但我认为这不是实现这一目标的有效解决方案。我想将地图键保留为字符串

@Entity
public class Root {
    @Id
    private Long code;

    private String value;

    @ElementCollection
    private Map<ItemKey, Item> items;
}
@Embeddable
public class ItemKey {
    private String keyValue;
}

当键是String时,是否有强制列名为某个自定义值?


共有1个答案

汪玮
2023-03-14

我终于找到了。就这么简单:

@Entity
public class Root {
    @Id
    private Long code;

    private String value;

    @ElementCollection
    @MapKeyColumn(name = "keyValue")
    private Map<String, Item> items;
}

我留下答案,以防它能帮助另一个像我一样迷失的人: P

 类似资料:
  • 是否可以使用枚举来定义键?(映射返回int String、Object。但这不是问题的一部分) 谢谢你的帮助。

  • 我定义了一个简单的迷你。原型文件如下: protoc编译器(--version==libprotoc 3.0.0,从protobuf-python-3.0.0-alpha-3的源代码安装)报告:

  • 问题内容: 我想使用GSON将下面的Example类序列化为JSON。 我期望得到以下输出: 但是调用函数返回 看来GSON无法在Map 内序列化Map 。这是GSON的限制,还是我在这里做错了? 问题答案: Nishant的答案之所以起作用,是因为Gson的默认构造函数默认启用所有类型的东西,否则您将不得不使用GsonBuilder手动启用它们。 从JavaDocs: 使用默认配置构造一个Gso

  • 我有这样一个代码: 你能帮我完成代码库吗?

  • 我目前正在尝试使用Jackson2.8.4将自定义映射类型序列化和反序列化为JSON。我已经设法基于这个答案实现了序列化,但我正在与反序列化作斗争。下面是一个例子:

  • 问题内容: 我对groovy的了解并没有超出我对Jenkinsfiles的了解。我试图弄清楚是否有可能在Jenkinsfile中定义一个映射,然后可以以“ for循环”方式应用该映射。 我有这些变量: 我的Jenkinsfile中有一个如下所示的: 有没有办法为每个配对做一个舞台?我的尝试还没有运气。 问题答案: Jenkins文档中有一些类似的用户提交的示例。 这样的事情应该起作用: