我需要将枚举列表映射到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
}
但是如果PostStatus
是List<PostStatus>
,我很容易找到解决方案。因为定义失败了。
具体来说:我有一张桌子,例如PostRelations
可以存储post_id
和status
的位置。为了示例起见,我可以存储多个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]
答案 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;
}