当前位置: 首页 > 知识库问答 >
问题:

使用JPA/Hibernate保存映射?

梁承恩
2023-03-14

我不是JPA/Hibernate方面的专家,我真的不知道我试图实现的是不可能实现的还是我做错了,既然我预计是后者,这里就什么也不做了。

我有一个map ,我正试图将其持久化到一个表中,并遵循了这里描述的示例:使用JPA存储map

@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注释应用于key列而不是value列。

我设法使其工作的唯一方法是使用map 。此外,我尝试在同一表中执行所有操作,但没有成功,因此我不得不声明另一个表,该表仅使用映射到实体的代理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个答案

汪学真
2023-03-14

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

 类似资料:
  • 问题内容: 我在父子表之间存在一对多关系。在父对象中,我有一个 我在子表中也有一个外键。此外键是引用数据库中父行的ID。因此,在我的数据库配置中,此外键不能为NULL。同样,此外键也是父表中的主键。 所以我的问题是如何通过执行以下操作来自动保存子对象: 我尝试了上面的方法,但是我收到一个数据库错误,抱怨Child表中的外键字段不能为NULL。是否可以告诉JPA自动将此外键设置为Child对象,以便

  • 问题内容: 我的问题围绕着我想用JPA映射的以下结构: 我的POJO非常简单(没有复合类型等,只有一些原语)。 如何在链接的问题中实施建议?我该如何仅用部分进行注释(当我仅对字段进行注释时,会发生类转换错误,因为HashMap无法转换为Blob,这是问题的根源- 我不能仅对值部分进行注释地图)? 我不确定是否需要使包装类型实现实现可包装List的Serializable,还是仅使用ArrayLis

  • 当我试图将一个实体的值保存到一个Oracle表列中时,我看到了一个例外,该列的属性值为new BigDecimal(“0.0000001”),该列的数据类型为数字(10,7)。具有相同比例的其他值,例如新的BigDecimal(“0.0000012”)将被保存。 以下是我看到的例外 13: 56:56561警告[JDBCExceptionReporter]SQL错误:1438,SQLState:2

  • 我无法看到我错过配置了什么。 你能告诉我,我可以做什么来解决这个问题,并使实体持久化到数据存储吗?

  • 在Postgresql中,我有一个类型为BIT(1)的列。在JPA映射中,如下所示: 但是,当我执行测试时,出现了这个错误: 错误:列“type”的类型是bit,但表达式的类型是character变化  提示:您将需要重写或强制转换表达式。  排名:117 我尝试过其他Java类型:char、int、Boolean和bitset。但是,同样的错误发生了。 您知道如何将Postgresql类型位(1

  • 问题内容: 我正在尝试将Postgres自定义类型(名为transmission_result)映射到Hibernate / JPA POJO。postgres自定义类型或多或少是字符串值的枚举类型。 我创建了一个名为PGEnumUserType的自定义EnumUserType以及一个表示postgres枚举值的枚举类。当我对一个真实的数据库运行它时,我收到以下错误:’ERROR:列“状态”的类型