简短版本:
我正在尝试创建:
@ElementCollection
private Map<String, Item> items;
,其中项目是可嵌入的,并且能够定义在项目表中为地图键创建的列名。Hibernate版本:5.0.12。最终的
完整解释:
以下是一个简化的示例,它再现了我的问题。我的出发点是@Embedable
的List
。
@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
时,是否有强制列名为某个自定义值?
我终于找到了。就这么简单:
@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文档中有一些类似的用户提交的示例。 这样的事情应该起作用: