JPA Hibernate Appel Postgres Fonction de Retour Void MappingException:

J'ai un problème lorsque je reçois un: org.mise en veille prolongée.MappingException: Aucun Dialecte de cartographie pour JDBC de type: 1111 lorsque vous essayez d'appeler une postgres de la fonction en utilisant JPA créer des indigènes de la requête.

J'ai créé un EJB minuterie de démarrage singleton pour exécuter une Postgres fonction toutes les 6 heures. La fonction de type void et vérifie les enregistrements expirés, les supprime, et les mises à jour de certains statuts. Il ne prend pas d'argument et renvoie void.

  • La postgres fonction fonctionne parfaitement si je l'appelle à l'aide PgAdmin outil de requête (fonction select();) et renvoie void.

  • Pour le déploiement de l'application sur Glassfish 3.1.1 j'obtiens une exception et d'une incapacité à déployer.

C'est l' (raccourcie) de la trace de pile:

WARNING: A system exception occurred during an invocation on EJB UserQueryBean method public void com.mysoftwareco.entity.utility.UserQueryBean.runRequestCleanup()
javax.ejb.TransactionRolledbackLocalException: Exception thrown from bean
...STACK TRACE BLAH BLAH BLAH ...
Caused by: javax.persistence.PersistenceException: org.hibernate.MappingException: No Dialect mapping for JDBC type: 1111

Voici le code:

D'abord l'APP étoffe:

public void runRequestCleanup() {
    String queryString = "SELECT a_function_that_hibernate_chokes_on()";
    Query query = em.createNativeQuery(queryString);
    Object result = query.getSingleResult();
}

C'est le singleton en l'appelant:

@Startup
@Singleton
public class RequestCleanupTimer {
    @Resource
    TimerService timerService;
    @EJB
    UserQueryBean queryBean;

    @PostConstruct
    @Schedule(hour = "*/6")
    void runCleanupTimer() {
        queryBean.runRequestCleanup();
    }
}

Et la fonction:

CREATE OR REPLACE FUNCTION a_function_that_hibernate_chokes_on()
  RETURNS void AS
$BODY$
    DECLARE 
        var_field_id myTable.field_id%TYPE;
    BEGIN
        FOR var_field_id IN
                select field_id from myTable 
                where status = 'some status'
                and disposition = 'some disposition'
                and valid_through < now()
        LOOP
            BEGIN
                -- Do Stuff
            END;
        END LOOP;
    END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
InformationsquelleAutor Bill Rosmus | 2012-09-24