5 Stimmen

Kann hibernate EnumTypes mit Whitespaces abbilden?

Nachdem ein Hibernate Mapping eine Legacy-Datenbank möchte ich EnumTypes verwenden, um bestimmte Spalten, die String-Konstanten mit Whitespace zu einigen Enum-Klasse zuordnen.

Die Kartierung:

@Entity
@Table(name = "OPERATOR")
public class Operator {   
    @Id
    @Column(name = "ID")
    private Long id;
    ...

    @Enumerated(EnumType.STRING)
    @Column(name = "STATUS")
    private Status status;
    ...
}

public enum Status {
    OPERATOR_CREATED("Operator created"),
    ACTIVE("Active"),
    END_DATED("End dated");

    private String name;

    Status(String status) {
       name = status;
    }
}

Wie Sie sehen können, können wir die Datenbankwerte nicht direkt als Enum-Namen verwenden, da sie Leerzeichen enthalten.

Ich frage mich, ob es möglich ist, Enums für diese zu verwenden?

4voto

mtpettyp Punkte 5513

Blick auf GenericEnumUserType beschrieben unter hibernate.org (Unter "Flexible Lösung")

Ändern Sie Status wie folgt:

public enum Status 
{
    OPERATOR_CREATED("Operator created"),
    ACTIVE("Active"),
    END_DATED("End dated");

    private String name;

    Status(String status) 
    {
       name = status;
    }

    public String toString()
    {
       return name;
    }

    public Status fromString( String value )
    {
        if ( "Operator created".equals( value ) 
        {
            return OPERATOR_CREATED;
        }
        //etc
    }
}

Verwenden Sie nun die @Type Bemerkung zu Ihrer Entität.

@Entity
@Table(name = "OPERATOR")
public class Operator {   
    @Id
    @Column(name = "ID")
    private Long id;
    ...

    @Column(name = "STATUS", columnDefinition = "VARCHAR(31)", nullable = false )
    @Type( type = "my.package.GenericEnumUserType",
           parameters = {
        @Parameter( name = "enumClass", value =  "my.package.Status" ),
        @Parameter( name = "identifierMethod", value = "toString" ),
        @Parameter( name = "valueOfMethod", value = "fromString" ) } )
    private Status status;
    ...
}

0 Stimmen

Sie können auch die Verwendung einer ReversibleEnum ( khanspot.com/2006/12/04/java-wish-a-reversible-enum ), um die fromString()-Methode für Status auf elegante Weise zu implementieren.

0voto

Anton Kim Punkte 765

Ich hatte genau die gleiche Situation, versuchen Sie es mit replace Funktion, etwa so:

@ColumnTransformer(read = "replace(status::varchar, ' ', '')", write = "replace(?, 'End', 'End ')::status")

Sie haben Unterstriche, also müssen Sie sie ein wenig ändern.

regexp_replace kann auch praktisch sein, wenn es mehrere Aufzählungswerte mit Leerzeichen gibt.

Hinweis: Ich verwende Postgresql 9.6

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X