坚持地图<长,布尔>用JPA / Hibernate?

时间:2015-07-07 17:22:00

标签: java hibernate jpa

我不是JPA / Hibernate的专家,我真的不知道我想要实现的是不可能的,或者我做错了,因为我认为后者在这里什么也没做。

我有一张地图&lt;长,布尔&gt;我试图坚持到一个表中,并遵循这里描述的例子:Storing a Map<String,String> using JPA

其他基本描述相同做法的例子。

我想做的是:

@Id    
private Long id;

@ElementCollection
@CollectionTable(name = "state_map", joinColumns = @JoinColumn(name = "id"))
@MapKeyColumn(name = "name")
@Column(name = "value")
@Type(type = "org.hibernate.type.TrueFalseType")
private Map<Long, Boolean> myBooleanMap;

我的表定义为:

CREATE TABLE if not exists state_map
(id BIGINT NOT NULL,
name BIGINT NOT NULL,
value CHAR);

但后来我得到了一个HibernateException:STATE_MAP中的列值类型错误。发现:bigint,预期:char(255)

当我将bigint更改为char(255)时,entityManager启动但当我尝试放入地图并且持久化时,我得到一个java.lang.ClassCastException:java.lang.Long无法转换为java.lang .Boolean。 我想@Type注释应用于键列而不是值列。

我设法使其成功的唯一方法是使用Map&lt;字符串,字符串&gt;。此外,我已经尝试在同一个表中执行所有操作,但是我必须使用映射到实体的代理ID来声明另一个:

CREATE TABLE if not exists state_id
(id serial primary key);

@Entity
@Table(name = "state_id")
public class StateModel {...}

希望有人能提供帮助,谢谢。

更新 - 解决方案

我通过引入一个embeddable来解决布尔值列来解决:

@Embeddable
class BooleanWrapper{

     @Column(name = "value")
     @Type(type = "org.hibernate.type.TrueFalseType")
     private Boolean myBoolean;}

我的地图变成了:

@ElementCollection
@CollectionTable(name = "state_map", joinColumns = @JoinColumn(name = "id"))
@MapKeyColumn(name = "name")
private Map<Long, BooleanWrapper> myBooleanMap;

1 个答案:

答案 0 :(得分:0)

我看到你用@Type(type =&#34; org.hibernate.type.TrueFalseType&#34;)注释了myBooleanMap,我认为这是不正确的。您可以为CHAR列定义TrueFalseType,而不是为map定义。我不认为bigint是个问题