如何在Map上定义MapKey列名<string,embeddable =“”>

时间:2017-11-02 12:52:16

标签: java hibernate jpa

简短版本:
我试图创建一个:

@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

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

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

编辑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; } 时,是否还要强制列名称为某个自定义值?

1 个答案:

答案 0 :(得分:2)

最后我发现了它。它很简单:

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

    private String value;

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

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