繁体   English   中英

使用JPA / Hibernate坚持Map <Long,Boolean>吗?

[英]Persist a Map< Long, Boolean > with JPA/Hibernate?

我不是JPA / Hibernate的专家,我真的不知道我试图实现的目标是不可能的,还是我做错了,因为我希望后者在这里什么都没有做。

我有一个Map <Long,Boolean>,我试图将其持久化到表中,并遵循此处描述的示例: 使用JPA存储Map <String,String>

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

我试图做的是:

@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 <String,String>。 我也尝试在同一张表中做所有无法正常工作的事情,因此我必须声明一个仅具有映射到实体的代理ID的表:

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

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

希望有人可以帮助,谢谢。

更新-解决方案

我已经解决了通过引入一个可包装布尔值列的可嵌入对象:

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

我看到您用@Type(type =“ org.hibernate.type.TrueFalseType”)注释了myBooleanMap,我认为这是不正确的。 您可以为CHAR列而不是映射定义TrueFalseType。 我认为bigint不是问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM