gpt4 book ai didi

java - 如何在 Map 上定义 MapKey 列名

转载 作者:行者123 更新时间:2023-12-04 03:08:20 26 4
gpt4 key购买 nike

简短版:
我正在尝试创建一个:

@ElementCollection
private Map<String, Item> items;

,其中Item@Embeddable,并且能够定义在Item 表中创建的列名称作为 map 的键。 hibernate 版本:5.0.12.Final

完整解释:
以下是重现我的问题的简化示例。我的起点是 @EmbeddableList

@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;

到目前为止一切顺利。接下来,我尝试将 List 转换为 Map 并使用 Item.keyValue 作为 map 的键:

@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_items 表中, map 的键列始终称为 items_key 并且我无法找到如何将此名称强制为 key_value

我尝试了以下替代方法:

@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_key:

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

我也尝试了上述所有组合,将 keyValue 保留在 Item 中,但后来我只得到了额外的列:

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 键是 @Embeddable 那么我可以实现它。但我认为这不是实现这一目标的有效解决方案。我想将 map 键保留为 String

@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

关于java - 如何在 Map<String, Embeddable> 上定义 MapKey 列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47075823/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com