[英]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.