【问题标题】:How to serialize a set of enums?如何序列化一组枚举?
【发布时间】:2016-03-02 07:24:53
【问题描述】:

是否可以在没有自定义属性转换器的情况下序列化一组枚举?

@Entity
public class SomeEntity {

    @Id
    @GeneratedValue
    private Integer id;

    private Set<DayOfWeek> days;

}

这组天数必须与 SomeEntity 在同一个表中。

我正在使用 Spring Data JPA 1.9 和 Hibernate 4.3.1。 谢谢。

【问题讨论】:

  • 是的。那么当你尝试时会发生什么?
  • 我得到这个异常:org.hibernate.MappingException:无法确定类型:java.util.Set,在表:some_entity,列:[org.hibernate.mapping.Column(days) ]
  • 我尝试使用 ddl-auto=create 启动应用程序并得到异常。
  • 是的,我的意思是“坚持”。我不想编写自定义属性转换器来将 Set 天转换为字符串并返回。
  • @Lob 将明确地 Java 将字段序列化为 1 列。我使用的 JPA 实现甚至不需要它,因为除了将 Java 序列化到单个列中之外,没有其他替代方法可以将其持久化。显然,您可以使用 ElementCollection 将它们放入连接表中

标签: java hibernate jpa orm spring-data


【解决方案1】:

Hibernates 存储所有声明实现Serializable的类型的属性。

但是您的days 属性的类型是Set,它扩展Serializable。要将您的集合存储为序列化值,您需要声明一个实现 Serializable 的集合类 - 就像大多数人一样。例如HashSet:

@Entity
public class SomeEntity {

    private HashSet<DayOfWeek> days;

}

您不需要任何进一步的注释。这适用于 Enum 和所有其他可序列化元素。

但是对于一组枚举存在另一种选择:使用 EnumSet,它将值存储到一个整数列中(每个枚举值恰好是一位)。在这里查看我的答案:JPA map collection of Enums

【讨论】:

    【解决方案2】:

    Enum 具有 Serializable 作为超接口(请参阅Javadoc API documentation for Enum

    因此,Hibernate(不需要可序列化)或 Spring Data JPA 不应该有任何特定问题。

    【讨论】:

    • 我得到这个异常:org.hibernate.MappingException:无法确定类型:java.util.Set,在表:some_entity,列:[org.hibernate.mapping.Column(days) ]
    • 您在“天”字段中设置了哪些注释(OneToMany、JoinColumn、Column ...)?
    • 添加了@Column(name = "days") 并得到了同样的异常。
    • 尝试用JoinTable(单向关系)代替Column
    • @atao 他明确表示:必须和SomeEntity同桌
    猜你喜欢
    • 1970-01-01
    • 2014-06-15
    • 2012-05-22
    • 1970-01-01
    • 2021-11-28
    • 2017-04-16
    • 1970-01-01
    • 2019-05-14
    • 2011-05-07
    相关资源
    最近更新 更多