简短版本:
我试图创建一个:
@ElementCollection
private Map<String, Item> items;
,其中Item
为@Embeddable
,并且能够定义在Item
表中为地图键创建的列名。 Hibernate版本:5.0.12.Final
完整解释:
以下是重现我的问题的简化示例。
我的起点是List
的{{1}}。
@Embeddable
使用此映射hibernate创建以下表:
@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;
}
到目前为止一切顺利。接下来,我尝试将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
虽然有效,但在@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
,我无法找到如何将此名称强制为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
我发现但类似的问题并没有解决我的问题:
@ElementCollection with Map<Entity, Embeddable> where Entity is a field of the Embeddable
Key & value column name overrides when mapping java.util.Map with JPA annotations
是否有强制列名称为某个自定义值?
编辑1:
我发现如果地图键是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)
);
那么我就可以实现它。
但我不认为这是实现这一目标的有效解决方案。我想将地图密钥保持为@Embeddable
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;
}
时,是否还要强制列名称为某个自定义值?
答案 0 :(得分:2)
最后我发现了它。它很简单:
@Entity
public class Root {
@Id
private Long code;
private String value;
@ElementCollection
@MapKeyColumn(name = "keyValue")
private Map<String, Item> items;
}
我留下答案,以防它可能帮助另一个像我一样迷失:P