PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Хибернация на картографиране между PostgreSQL enum и Java enum

Можете просто да получите тези типове чрез Maven Central, като използвате зависимостта Hibernate Types:

<dependency>
    <groupId>com.vladmihalcea</groupId>
    <artifactId>hibernate-types-52</artifactId>
    <version>${hibernate-types.version}</version>
</dependency>

Ако лесно съпоставите Java Enum с тип колона PostgreSQL Enum, като използвате следния персонализиран тип:

public class PostgreSQLEnumType extends org.hibernate.type.EnumType {
     
    public void nullSafeSet(
            PreparedStatement st, 
            Object value, 
            int index, 
            SharedSessionContractImplementor session) 
        throws HibernateException, SQLException {
        if(value == null) {
            st.setNull( index, Types.OTHER );
        }
        else {
            st.setObject( 
                index, 
                value.toString(), 
                Types.OTHER 
            );
        }
    }
}

За да го използвате, трябва да анотирате полето с Hibernate @Type анотация, както е илюстрирано в следния пример:

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

Това съпоставяне предполага, че имате post_status_info тип enum в PostgreSQL:

CREATE TYPE post_status_info AS ENUM (
    'PENDING', 
    'APPROVED', 
    'SPAM'
)

Това е всичко, работи като чар. Ето тест в GitHub, който го доказва.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как Asind() работи в PostgreSQL

  2. Как justify_interval() работи в PostgreSQL

  3. Анотацията на Spring Data @CreatedDate не работи за мен

  4. Как да предоставим на API клиент с 1 000 000 резултати от база данни?

  5. Spring + Hibernate:Използване на кеш паметта на план за заявка