使用Hibernate/Spring数据将枚举列表映射到PostgreSQL中的字段

使用Hibernate/Spring数据将枚举列表映射到PostgreSQL中的字段,postgresql,hibernate,spring-data,Postgresql,Hibernate,Spring Data,在使用Hibernate的PostgreSQL中,有很多将原始数据类型(如整数或字符串)的数组或列表映射到数据库字段的示例。我想知道是否可以在PostgreSQL中使用Hibernate将枚举列表映射到数据库字段,而不使用附加的DB表。下面是一个用例 public enum Language { EN, FR, ZH } @Entity @Table(name = "person") public class Person { @Id @GeneratedValue(st

在使用Hibernate的PostgreSQL中,有很多将原始数据类型(如整数或字符串)的数组或列表映射到数据库字段的示例。我想知道是否可以在PostgreSQL中使用Hibernate将枚举列表映射到数据库字段,而不使用附加的DB表。下面是一个用例

public enum Language {
    EN, FR, ZH
}

@Entity
@Table(name = "person")
public class Person {

   @Id
   @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
   @SequenceGenerator(name = "sequenceGenerator")
   private long id;        

   private List<Language> languages ;
   ...
}
公共枚举语言{
嗯,FR,ZH
}
@实体
@表(name=“person”)
公共阶层人士{
@身份证
@GeneratedValue(策略=GenerationType.SEQUENCE,generator=“sequenceGenerator”)
@SequenceGenerator(name=“SequenceGenerator”)
私人长id;
私人名单语言;
...
}

如果您想以特定于PostgreSQL的方式映射枚举列表,可以执行以下操作:

将库添加到项目中:

<dependency>
    <groupId>com.vladmihalcea</groupId>
    <artifactId>hibernate-types-52</artifactId>
    <version>2.1.1</version>
</dependency>
将枚举集合映射到此类型:

@Entity
@Table(name = "person")
@TypeDef(name = "pgsql_enum", typeClass = PostgreSQLEnumType.class)
public class Person {

    //...

    @Enumerated(STRING)
    @ElementCollection
    @CollectionTable(name = "person_languages", 
            joinColumns = @JoinColumn(name = "person_id"), 
            foreignKey = @ForeignKey(name = "fk_person_languages_person"))
    @Column(name = "language", columnDefinition = "languages", nullable = false)
    @Type(type = "pgsql_enum")
    private List languages;
}
@实体
@表(name=“person”)
@TypeDef(name=“pgsql_enum”,typeClass=PostgreSQLEnumType.class)
公共阶层人士{
//...
@枚举(字符串)
@元素集合
@CollectionTable(name=“person\u languages”,
joinColumns=@JoinColumn(name=“person\u id”),
foreignKey=@foreignKey(name=“fk\u person\u languages\u person”))
@列(name=“language”,columnDefinition=“languages”,nullable=false)
@类型(Type=“pgsql\u enum”)
私人名单语言;
}
有关休眠类型的更多信息,请参见its作者Vlad Mihalcea的网页

如果您不需要特定于PostgreSQL的方法,可以像下面这样映射枚举列表:

@Entity
@Table(name = "person")
public class Person {

    //...

    @Enumerated(STRING)
    @ElementCollection
    @CollectionTable(name = "person_languages", 
            joinColumns = @JoinColumn(name = "person_id"), 
            foreignKey = @ForeignKey(name = "fk_person_languages_person"))
    @Column(name = "language", length = 2, nullable = false)
    private List<Language> languages;
}
@实体
@表(name=“person”)
公共阶层人士{
//...
@枚举(字符串)
@元素集合
@CollectionTable(name=“person\u languages”,
joinColumns=@JoinColumn(name=“person\u id”),
foreignKey=@foreignKey(name=“fk\u person\u languages\u person”))
@列(name=“language”,长度=2,可空=false)
私人名单语言;
}

感谢您的输入。实际上,我正在寻找一个没有附加DB表的解决方案。若我想为语言使用一个表,我将创建另一个实体类,并与Person建立一对多关系。该方法的一个问题是由于附加连接而导致的性能。在Vlad的数组映射示例中,没有任何附加实体或DB表。
@Entity
@Table(name = "person")
public class Person {

    //...

    @Enumerated(STRING)
    @ElementCollection
    @CollectionTable(name = "person_languages", 
            joinColumns = @JoinColumn(name = "person_id"), 
            foreignKey = @ForeignKey(name = "fk_person_languages_person"))
    @Column(name = "language", length = 2, nullable = false)
    private List<Language> languages;
}