IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Spring Boot Java Discussion :

Spring Boot : Configurer Hibernate Session


Sujet :

Spring Boot Java

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 391
    Points : 185
    Points
    185
    Par défaut Spring Boot : Configurer Hibernate Session
    Bonjour à tous,

    j'ai l'erreur suivante :

    org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread
    Voici le contexte: Mon application utilise Spring Boot pour le backoffice et AngularJs pour le front.
    J'essai de récupérer une image uploader pour la sotcker dans un Blob de ma BDD MySQL.

    Donc la première étape est d'envoyer le fichier par AngularJS :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    var fd = new FormData();
    fd.append("file", this.credentials.avatar);
     
    $http.post(
        '/register-user-blob', 
        fd,
        {
            transformRequest: angular.identity,
            headers: {'Content-Type': undefined}
        }
    )
    Ensuite, mon Webservice Rest (Spring @RestController) reçoit le fichier sous forme de MultipartFile (classe fournie par Spring) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    import java.sql.Blob;
    import org.hibernate.Hibernate;
    import org.hibernate.SessionFactory;
    import org.springframework.web.multipart.MultipartFile;
    import com.google.gson.Gson;
    //[...others imports]
     
    @RestController
    public class RegisterRest {
     
        @Autowired
        private SessionFactory sessionFactory;
     
        @RequestMapping(value = "/register-user-blob", produces = "application/json")
        public FormRegisterResponseDto registerUserWithBlob(@RequestParam(value="file", required=false) MultipartFile file){
     
            Blob avatar = null;
     
            System.out.println(file.getOriginalFilename()); // It works so I receive the MultipartFile correctly.
            System.out.println(sessionFactory); // It works, so SessionFactory is not null
     
            try {
                avatar = Hibernate.getLobCreator(sessionFactory.getCurrentSession()).createBlob(file.getInputStream(),file.getSize());
            } catch (HibernateException e) {
                // ...
            } catch (IOException e) {
                // ...
            }
     
            try{
                // try to insert into databases
            } catch (Exception ex){
                // ...
            }
     
            return new FormRegisterResponseDto();
        }
     
    }
    Comme vous pouvez le voir, j'essai de "caster" mon MultipartFile en java.sql.Blob via org.hiberbate.Hibernate.getLobCreator(...) qui prend une Hibernate Session en paramètre.

    D'après ce que j'ai compris, il faut configurer Spring Boot pour qu'il fournisse une session Hibernate car par défaut il fourni une session JPA.

    Donc j'ai trouvé en fouillant le net les éléments suivants pour faire cette configuration :

    mon fichier application.properties :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate4.SpringSessionContext
    ma classe de configuration de Spring Boot :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    @SpringBootApplication
    public class BusinessBootApplication {
     
    	public static void main(String[] args) {
    		SpringApplication.run(BusinessBootApplication.class, args);
    	}
     
    	@Bean
    	public HibernateJpaSessionFactoryBean sessionFactory(){
    		return new HibernateJpaSessionFactoryBean();
    	}
     
    }
    Malgré ces configurations, j'ai mon erreurs, vous avez une idée ? Merci d'avance

  2. #2
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 135
    Points : 391
    Points
    391
    Par défaut
    Le message en lui même est clair :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread
    Il lui manque une transaction et du coup, il gueule.

    L'annotation @Transactional peut t'aider.

    Sinon, plusieurs chose me pique les yeux dans ton code.

    * Ton log:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(...)
    Par pitié utiliser un vrai système de log.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    public class Maclass {
       private static final Logger LOGGER = LoggerFactory.getLogger(Maclass .class);
     
     
       public void maMethode() {
     
        LOGGER.info("log d'information");
        LOGGER.warn("log d'avertissement");
        LOGGER.error("log d'erreur");
        LOGGER.debug("log de debug");
     
      }
     
    }

    Séparation des couches :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    @RestController
    public class RegisterRest {
     
        @Autowired
        private SessionFactory sessionFactory;
    Haaaa!! hérésie au bucher !!! :p
    Le mieux c'est que tu fasse un DAO qui te fera ce boulot la si tu ne veut pas utiliser JPA.
    Et c'est ce DAO que ton controller REST appelle.
    DAO qui aura le @Transactional.

    Tu separe les responsabilités.
    Le DAO s'occupe des accès base, ton controller REST s'occupe de fournir des infos au navigateur.

Discussions similaires

  1. Configuration Hibernate Spring et JTA
    Par totoranky dans le forum Hibernate
    Réponses: 3
    Dernier message: 28/08/2009, 17h03
  2. configurer hibernate sous Spring web services
    Par MyPaiN dans le forum Hibernate
    Réponses: 2
    Dernier message: 25/05/2009, 12h22
  3. [Framework] Spring Hibernate session java.sql.Connection config
    Par yLaplace dans le forum Spring
    Réponses: 0
    Dernier message: 22/01/2009, 11h16
  4. Réponses: 17
    Dernier message: 29/12/2008, 11h29
  5. [Integration] No Hibernate Session bound to thread, ejb3 stateless et Spring
    Par pbdlpc dans le forum Spring
    Réponses: 4
    Dernier message: 26/09/2008, 17h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo