Hibernate将List <Enums>映射到Postgres枚举

时间:2019-07-15 08:28:41

标签: postgresql hibernate enums

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

对于1:1关系的通用映射,我发现this post非常有用。代码如下:

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

但是如果PostStatusList<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;

}

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

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 个答案:

答案 0 :(得分:0)

经过一些研究并深入研究了问题,由于sample的正确链接和设置,我终于解决了问题:

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

和现有enum 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;
}