Comment mapper une énumération PostgreSQL avec JPA et Hibernate

vikash dat:

J'essaie de mapper un type personnalisé postgres, nommé transmission_result, à un POJO Hibernate / JPA. Le type personnalisé postgres est plus ou moins un type enum de valeurs de chaîne.

J'ai créé un EnumUserType personnalisé appelé PGEnumUserType ainsi qu'une classe enum représentant les valeurs énumérées postgres. Lorsque je l'exécute sur une base de données réelle, je reçois l'erreur suivante: 'ERREUR: la colonne "status" est de type transmission_result mais l'expression est de type character variant. Conseil: vous devrez réécrire ou transtyper l'expression. Position: 135 '

En voyant cela, j'ai pensé que je devais changer mes SqlTypes en Types.OTHER. Mais cela interrompt mes tests d'intégration (en utilisant HyperSQL dans la base de données de mémoire) avec le message: 'Causé par: java.sql.SQLException: Table introuvable dans l'instruction [sélectionnez inscription0 _. "Id" comme id1_47_0_, inscription0 _. "Tpa_approval_id" comme tpa2_47_0_ , inscription0 _. "tpa_status_code" comme tpa3_47_0_, inscription0 _. "status_message" comme status4_47_0_, inscription0 _. "Approbation_id" comme approbation5_47_0_, transmission inscription0 _. "transmission_date" comme transmis6_47_0_, inscription0 _. "status_ comme transmis6_47_0_, inscription0_ transmissions "inscription0_ où inscription0 _." id "=?] '

Je ne sais pas pourquoi la modification du sqlType entraîne cette erreur. Toute aide est appréciée.

Entité JPA / Hibernate:

@Entity
@Access(javax.persistence.AccessType.PROPERTY)
@Table(name="transmissions")
public class EnrollmentCycleTransmission {

// elements of enum status column
private static final String ACCEPTED_TRANSMISSION = "accepted";
private static final String REJECTED_TRANSMISSION = "rejected";
private static final String DUPLICATE_TRANSMISSION = "duplicate";
private static final String EXCEPTION_TRANSMISSION = "exception";
private static final String RETRY_TRANSMISSION = "retry";

private Long transmissionID;
private Long approvalID;
private Long transmitterID;
private TransmissionStatusType transmissionStatus;
private Date transmissionDate;
private String TPAApprovalID;
private String TPAStatusCode;
private String TPAStatusMessage;


@Column(name = "id")
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public Long getTransmissionID() {
    return transmissionID;
}

public void setTransmissionID(Long transmissionID) {
    this.transmissionID = transmissionID;
}

@Column(name = "approval_id")
public Long getApprovalID() {
    return approvalID;
}

public void setApprovalID(Long approvalID) {
    this.approvalID = approvalID;
}

@Column(name = "transmitter")
public Long getTransmitterID() {
    return transmitterID;
}

public void setTransmitterID(Long transmitterID) {
    this.transmitterID = transmitterID;
}

@Column(name = "status")
@Type(type = "org.fuwt.model.PGEnumUserType" , parameters ={@org.hibernate.annotations.Parameter(name = "enumClassName",value = "org.fuwt.model.enrollment.TransmissionStatusType")} )
public TransmissionStatusType getTransmissionStatus() {
    return this.transmissionStatus ;
}

public void setTransmissionStatus(TransmissionStatusType transmissionStatus) {
    this.transmissionStatus = transmissionStatus;
}

@Column(name = "transmission_date")
public Date getTransmissionDate() {
    return transmissionDate;
}

public void setTransmissionDate(Date transmissionDate) {
    this.transmissionDate = transmissionDate;
}

@Column(name = "tpa_approval_id")
public String getTPAApprovalID() {
    return TPAApprovalID;
}

public void setTPAApprovalID(String TPAApprovalID) {
    this.TPAApprovalID = TPAApprovalID;
}

@Column(name = "tpa_status_code")
public String getTPAStatusCode() {
    return TPAStatusCode;
}

public void setTPAStatusCode(String TPAStatusCode) {
    this.TPAStatusCode = TPAStatusCode;
}

@Column(name = "status_message")
public String getTPAStatusMessage() {
    return TPAStatusMessage;
}

public void setTPAStatusMessage(String TPAStatusMessage) {
    this.TPAStatusMessage = TPAStatusMessage;
}
}

EnumUserType personnalisé:

public class PGEnumUserType implements UserType, ParameterizedType {

private Class<Enum> enumClass;

public PGEnumUserType(){
    super();
}

public void setParameterValues(Properties parameters) {
    String enumClassName = parameters.getProperty("enumClassName");
    try {
        enumClass = (Class<Enum>) Class.forName(enumClassName);
    } catch (ClassNotFoundException e) {
        throw new HibernateException("Enum class not found ", e);
    }

}

public int[] sqlTypes() {
    return new int[] {Types.VARCHAR};
}

public Class returnedClass() {
    return enumClass;
}

public boolean equals(Object x, Object y) throws HibernateException {
    return x==y;
}

public int hashCode(Object x) throws HibernateException {
    return x.hashCode();
}

public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException {
    String name = rs.getString(names[0]);
    return rs.wasNull() ? null: Enum.valueOf(enumClass,name);
}

public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException {
    if (value == null) {
        st.setNull(index, Types.VARCHAR);
    }
    else {
        st.setString(index,((Enum) value).name());
    }
}

public Object deepCopy(Object value) throws HibernateException {
    return value;
}

public boolean isMutable() {
    return false;  //To change body of implemented methods use File | Settings | File Templates.
}

public Serializable disassemble(Object value) throws HibernateException {
    return (Enum) value;
}

public Object assemble(Serializable cached, Object owner) throws HibernateException {
    return cached;
}

public Object replace(Object original, Object target, Object owner) throws HibernateException {
    return original;
}

public Object fromXMLString(String xmlValue) {
    return Enum.valueOf(enumClass, xmlValue);
}

public String objectToSQLString(Object value) {
    return '\'' + ( (Enum) value ).name() + '\'';
}

public String toXMLString(Object value) {
    return ( (Enum) value ).name();
}
}

Classe d'énumération:

public enum TransmissionStatusType {
accepted,
rejected,
duplicate,
exception,
retry}
vikash dat:

Je l'ai compris. J'avais besoin d'utiliser setObject au lieu de setString dans la fonction nullSafeSet et de passer le Types.OTHER en tant que java.sql.type pour faire savoir à jdbc qu'il s'agissait d'un type postgres.

public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException {
    if (value == null) {
        st.setNull(index, Types.VARCHAR);
    }
    else {
//            previously used setString, but this causes postgresql to bark about incompatible types.
//           now using setObject passing in the java type for the postgres enum object
//            st.setString(index,((Enum) value).name());
        st.setObject(index,((Enum) value), Types.OTHER);
    }
}

Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.

En cas d'infraction, veuillez [email protected] Supprimer.

modifier le
0

laisse moi dire quelques mots

0commentaires
connexionAprès avoir participé à la revue

Articles connexes

Mapper une énumération dans JPA avec des valeurs fixes?

Comment mapper un tableau multidimensionnel Java avec PostgreSQL et Hibernate

Comment mapper une valeur à une énumération?

Comment mapper les propriétés calculées avec JPA et Hibernate

Comment mapper une colonne avec le type BIT (24) dans PostgreSQL avec Hibernate

Mapper avec une clé d'énumération et différents types de valeur

Comment mapper la propriété d'entité avec une requête personnalisée et Hibernate

Comment puis-je mapper une énumération à un booléen avec mapstruct?

Hibernate comment mapper un champ String à une colonne numérique

Comment mapper une énumération à une autre énumération en tapuscrit?

Comment supprimer une entité avec l'aide de JPA et SE JOINT Hibernate

Comment appeler une procédure stockée avec Hibernate et JPA?

Comment gérer les références circulaires dans JPA et Hibernate avec une entité associative

Comment renvoyer SUM à partir d'une requête JPA avec Hibernate et Spring-boot?

Utiliser le type Point avec PostgreSQL et JPA / Hibernate

Comment exporter une énumération typographique avec systemjs et Angular2?

Comment utiliser une énumération et switch () avec UITableViewController dans Swift

Comment obtenir une seule instance pour une entité en lecture seule associée avec JPA et Hibernate?

Comment énumérer une énumération avec le type String?

Enregistrement d'une fonction SQL avec JPA et Hibernate

Mapper une liste de chaînes avec des annotations JPA / Hibernate

Comment utiliser Java 8 LocalDateTime avec JPA et Hibernate

Comment empêcher l'injection SQL avec JPA et Hibernate?

Comment réparer StaleObjectStateException avec JPA et Hibernate

Comment utiliser la génération automatique d'identité d'Oracle 12c avec Hibernate, Spring et JPA?

Comment mapper une matrice 2D en Java vers Hibernate / JPA?

Itérer sur une énumération avec dactylographié et attribuer à une énumération

Comment générer un script de création ddl avec une configuration Spring Boot + Data JPA et Hibernate moderne?

Comment supprimer des objets enfants d'une relation @ManyToMany avec beaucoup d'enfants dans JPA et Hibernate

TOP liste

  1. 1

    Comment exécuter un fichier python avec des droits d'administrateur dans pycharm

  2. 2

    comment obtenir un objet de requête dans les tests unitaires de django?

  3. 3

    mongo kafka connect source

  4. 4

    Vérifier la longueur du nombre à partir du message, puis utiliser la valeur dans l'instruction

  5. 5

    comment convertir une chaîne en un tuple dateutil jour de la semaine sans utiliser eval

  6. 6

    Comment ajouter un texte dans un texte Python/Tkinter

  7. 7

    Aide de variable de débogage pprint jinja2

  8. 8

    Dans les modèles Hugo, comment vérifier la longueur du tableau de fichiers JSON?

  9. 9

    Impression de la longueur du chemin le plus court dans le labyrinthe

  10. 10

    Exécuter la requête externe pour chaque date obtenue à partir de la requête interne

  11. 11

    Recherche de dicton Jinja2 à l'aide d'une clé variable

  12. 12

    Algorithme: diviser de manière optimale une chaîne en 3 sous-chaînes

  13. 13

    Comment obtenir l'intégration contextuelle d'une phrase dans une phrase à l'aide de BERT ?

  14. 14

    définir une propriété pour chaque nœud dans neo4j

  15. 15

    Pourquoi cette requête Java échoue-t-elle? renvoyer 0 quand il y a des résultats

  16. 16

    Comment changer le navigateur par défaut en Microsoft Edge pour Jupyter Notebook sous Windows 10 ?

  17. 17

    Laravel 8: Attempt to read property "id" on null

  18. 18

    Comment obtenir tous les champs d'un objet (y compris sa superclasse), à l'aide de l'API Mirrors de Dart?

  19. 19

    Référencement des assemblys de structure .net 4.7 dans la solution .net core 2

  20. 20

    Microsoft.WebApplication.targets

  21. 21

    obtenir le nombre de marqueur affiché sur la carte

chaudétiquette

Archive