我不是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;
答案 0 :(得分:0)
我看到你用@Type(type =&#34; org.hibernate.type.TrueFalseType&#34;)注释了myBooleanMap,我认为这是不正确的。您可以为CHAR列定义TrueFalseType,而不是为map定义。我不认为bigint是个问题