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

Hibernate映射列表到Postgres枚举

邹海荣
2023-03-14

我需要将枚举列表映射到Postgres中的表。

对于1:1关系的一般映射,我发现这篇文章非常有用。代码如下所示:

@Entity(name = "Post")
@Table(name = "post")
@TypeDef(
    name = "pgsql_enum",
    typeClass = PostgreSQLEnumType.class
)
public static class Post {

    @Id
    private Long id;

    private String title;

    @Enumerated(EnumType.STRING)
    @Column(columnDefinition = "post_status_info")
    @Type( type = "pgsql_enum" )
    private PostStatus status;

    //Getters and setters omitted for brevity
}

但是如果poststatus是一个列表 ,那么我就可以轻松地找到一个解决方案。因为定义失败了。

为了使其具体化:我有一个表,例如postrelations,我可以在其中存储post_idstatus。为了示例起见,我可以存储多个status(例如,基于时间的)。那么如何正确地定义它,如果我有

@Entity(name = "Post")
@Table(name = "post")
public static class Post {

    @Id
    private Long id;
    private String title;
    private List<PostStatus> status;

}

以同样的方式定义它的方法会导致异常(这似乎很清楚,因为注释是针对枚举而不是针对列表)

Caused by: java.lang.ClassCastException: interface java.util.List
    at java.lang.Class.asSubclass(Class.java:3404) ~[na:1.8.0_212]
    at org.hibernate.type.EnumType.setParameterValues(EnumType.java:86) ~[hibernate-core-5.3.10.Final.jar:5.3.10.Final]

共有1个答案

彭允晨
2023-03-14

经过一些研究和挖掘,我终于解决了这个问题,这要感谢示例提供了正确的链接和设置:

@ElementCollection
@CollectionTable(name = "post_permission", joinColumns = @JoinColumn(name = "post_id"))
private List<PostStatus4Save> status;

和围绕现有枚举PostStatus的薄包装

@Embeddable
@Data //lombok
@TypeDef(name = "pgsql_enum", typeClass = PostgreSQLEnumType.class)
@AllArgsConstructor //lombok
@NoArgsConstructor  //lombok
public class PostStatus4Save {

    @Enumerated(EnumType.STRING)
    @Type(type = "pgsql_enum")
    PostStatus postPermission;
}
 类似资料:
  • 问题内容: 假设我有这个枚举: 通过以下映射: 枚举被发送到数据库,,。我希望这些值改为存储为,或存储在varchar列中。 如何将枚举映射到varchar列? 问题答案: 将其添加为EnumType的参数: 这是因为等效于java.sql.Types.VARCHAR

  • 问题内容: 我需要预先将未实现接口的枚举映射到现有数据库,该数据库使用将该枚举存储在与所有者类相同的表中。 在这种情况下应如何处理映射?持久化到数据库不会改变,因为实现该接口的所有枚举都将具有不同的值,但是我不确定应如何从数据库中检索对象(我是否需要自定义映射器,它将尝试实例化一个使用指定的enum类进行枚举吗?Hibernate本身是否支持此功能?)。 问题答案: 可以创建一个自定义(例如thi

  • 问题内容: Hibernate提供的注释支持使用或的两种类型的映射。当我们使用映射时,它使用的“名称” 而不是Enum的表示形式。在数据库列仅包含一个字符的情况下,这是一个问题。例如,我有以下枚举: 当我坚持枚举使用,即hibernate尝试在数据库中存储的值是开放的。但是,我的数据库列仅包含一个字符,因此会引发异常。 克服这个问题的一个办法是改变枚举类型持有单个字符(如,代替,)。但是,这降低了

  • 问题内容: 我有一个类别hibernate模型: 其中有一个类型字符串字段。我也有一个Java枚举,它表示类别的类型: 我想用它代替字符串类型。SQL在varchar参数中接受两个不同的值:或。我希望Category模型类接受一个枚举变量- 每当hibernate要求它时,都以某种方式将其映射到字符串。 可能吗? 问题答案: 是的,有可能。它应该是:

  • 我有一个类别Hibernate模型: 它们具有类型字符串字段。另外,我还有一个Java枚举,它表示类别的一种类型:

  • 我有一个实体,其类型由enum表示。数据库是Postgres,在那里表示为枚举类型。我使用JPA/Hibernate及其存储库。请注意,我是JPA、Hibernate和Kotlin的新手。 我试图创建自定义,我需要选择类型(枚举)在可能类型列表中的公司。我,但是,遇到各种错误类型铸造在SQL和/或语法的。 Kotlin中数据类