【问题标题】:Mapping A List of Enum to A Field in PostgreSQL With Hibernate/Spring Data使用 Hibernate/Spring 数据将枚举列表映射到 PostgreSQL 中的字段
【发布时间】:2018-10-11 20:38:15
【问题描述】:

在使用 Hibernate 的 PostgreSQL 中,有很多将原始数据类型(如整数或字符串)的数组或列表映射到数据库字段的示例。我想知道是否可以将枚举列表映射到数据库字段,而无需使用 Hibernate 在 PostgreSQL 中添加额外的数据库表。这是用例之一。

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 ;
   ...
}

【问题讨论】:

    标签: postgresql hibernate spring-data


    【解决方案1】:

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

    hibernate-types lib 添加到您的项目中:

    <dependency>
        <groupId>com.vladmihalcea</groupId>
        <artifactId>hibernate-types-52</artifactId>
        <version>2.1.1</version>
    </dependency>
    

    将枚举类型 languages 添加到您的 PostgreSQL 数据库中:

    create type languages as enum (
      'EN', 'FR', 'ZH'
    );
    

    用这种类型映射你的枚举集合:

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

    有关 hibernate-types lib 的更多信息,请参阅其作者 Vlad Mihalcea,site

    如果您不需要 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;
    }
    

    【讨论】:

    • 感谢您的意见。我实际上正在寻找没有额外数据库表的解决方案。如果我想为语言使用表,我将创建另一个实体类并与 Person 建立一对多的关系。该方法的一个问题是由于附加连接而导致的性能问题。在 Vlad 的数组映射示例中,没有任何额外的实体或数据库表。
    猜你喜欢
    • 2018-04-11
    • 1970-01-01
    • 2012-04-08
    • 2023-03-20
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 2012-08-24
    • 1970-01-01
    相关资源
    最近更新 更多