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