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

JPA Java Discussion :

Jpa @Lob byte[] postGreSql - could not load Entity


Sujet :

JPA Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 85
    Par défaut Jpa @Lob byte[] postGreSql - could not load Entity
    Bonjour à vous.

    J'aimerai vous exposer un problème qui "persiste" depuis un moment dont je ne trouve la solution.

    Je souhaiterai récupérer des images que j'ai pu enregistrer sur mon serveur mais j'ai droit à une erreur comme celle-ci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: could not load an entity: [com.echange.model.offre.ImageOffre#4]
    La table Image sous postGreSql 9.0
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    id bigserial NOT NULL,
      file_name character varying(255) NOT NULL,
      imagefile oid,
      offre bigint
    Son contenu :

    id : filename : imagefile(oid) : offre (id)
    4;"DSCF4045.JPG";19484;57
    5;"DSCF4105.JPG";19485;57
    6;"DSCF4125.JPG";19486;57
    7;"DSCF4237.JPG";19491;76
    8;"DSCF4246.JPG";19492;76


    La classe associé , JPA 2.0

    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
    @Entity
    @Table(name = "offre_image", catalog = "public", uniqueConstraints = @UniqueConstraint(columnNames = {"id"}))
    public class ImageOffre implements Serializable{
    
    
    	private static final long serialVersionUID = 1L;
    
    	@Id
    	@GeneratedValue(strategy = IDENTITY)
    	@Column(name = "id", unique = true, nullable = false)
    	private Long id;
    
    	@ManyToOne
        @JoinColumn(name="offre",referencedColumnName="id")
        private Offre offre;
    	
    	@Column(name = "file_name", nullable = false)
    	private String fileName;
    	
    	@Lob
    	@Basic(fetch=FetchType.EAGER) // this gets ignored anyway, but it is recommended for blobs
    	@Type(type="org.hibernate.type.PrimitiveByteArrayBlobType")
    	protected  byte[]  imageFile;
    Vous remarquez que j'ai annoté l'image par @Lob. Qu'elle est chargé lors de la demande par FetchType.EAGER et que ma variable est de type byte[] (c'est une image, et j'enregistre sa valeur en byte[] )

    J'ai ajouté un type qui spécifie que le blob est un byteArray
    @Type(type="org.hibernate.type.PrimitiveByteArrayBlobType")

    Avec ou sans, je n'arrive à récupérer mon entity.

    J'ajoute dans mon persistence.xml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <property name="hibernate.jdbc.use_streams_for_binary" value="false" />
    car j'utilise des oid est @Lob fournit des oid avec PostgreSQL.

    Avec ou sans, je n'arrive à récupérer mon entity aussi.

    J'ai toujours l'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: could not load an entity: [com.echange.model.offre.ImageOffre#4]
    Quand j'effectue cette requête suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Query query = em.createNativeQuery("select id from offre_image where offre=:idOffre");
    			query.setParameter("idOffre",idOffre.getId());
    			List<ImageOffre> liC = new ArrayList<ImageOffre>();
    			List<BigInteger> li = query.getResultList();
    			if(li != null)
    			{
    				for(int i = 0; i < li.size(); i++)
    				{
    					ImageOffre imO = (ImageOffre)em.find(ImageOffre.class, Long.parseLong(li.get(i).toString()));
    					liC.add(imO);
    				}
    			}
    			return liC;
    OR !!!!

    L'implémentation @Lob marche très bien dans mon autre table :

    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
    @Entity
    @Table(name = "offre_acces", catalog = "public", uniqueConstraints = @UniqueConstraint(columnNames = {"id"}))
    public class Offre implements Serializable{
    	
    	private static final long serialVersionUID = 1L;
    
    	@Id
    	@GeneratedValue(strategy = IDENTITY)
    	@Column(name = "id", unique = true, nullable = false)
    	private Long id;
    
    ....
    ....
    ....
    
    	@Lob
    	@Basic(fetch=FetchType.EAGER) // this gets ignored anyway, but it is recommended for blobs
    	protected  byte[]  imageFile;
    	
    	@Column(name = "file_name")
    	private String fileName;
    
    	@Column(name = "images")
    	@OneToMany(mappedBy="offre", cascade=CascadeType.ALL, targetEntity=ImageOffre.class, fetch=FetchType.LAZY)
        private List<ImageOffre> images;
    ici, faire un "from Offre where offre=:offre" me renvoie toutes mes données et mon image qui s'affiche très bien dans mon interface

    Hors, il n'y a aucune différence de code avec ma classe entity ImageOffre (mise à part @Type, mais avec ou sans rien ne change)

    Qu'en pensez vous ?

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 85
    Par défaut
    Bonjour à tous.


    Je poursuis dans le processus.

    J’avance un peut.

    J'ai mieux ciblé où était le problème :

    Rappel : erreur sur la requête suivante
    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
    List<ImageOffre> getPicks(Offre idOffre){
    Query query = em.createNativeQuery("select id from offre_image where offre=:idOffre");
    			query.setParameter("idOffre",idOffre.getId());
    			List<ImageOffre> liC = new ArrayList<ImageOffre>();
    			List<BigInteger> li = query.getResultList();
    			if(li != null)
    			{
    				for(int i = 0; i < li.size(); i++)
    				{
    					ImageOffre imO = (ImageOffre)em.find(ImageOffre.class, Long.parseLong(li.get(i).toString()));
    					liC.add(imO);
    				}
    			}
    			return liC;
    }
    Lors d'une transaction sur un service qui demanderai les images d'un client, cette requête fonctionne, c'est à dire.

    @Transactional
    getImages(Offre) --> getPicks(Offre)

    la requête s'exécute et me récupère mes images.


    Le souci de cette requête intervient quand j'exécute une mise a jour sur la liste des images du client et veuille en récupérer ensuite sa totalité (afin de vérifier son enregistrement)

    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
     
    //Service
    update(client, images)
     
     
    //Domain
    public function update(Offre client, List<Image> images)
    {
    try{
    tx = em.getTransaction();
    tx.begin;
        Update(client, images) ; //Ajout d'une image au client spécifié
    tx.commit;
        getImages(client, em);
     
    }catch(PersistenceException e)
    {
    	  tx.rollback();
    }
    finally {
               if (em != null) 
            {
    	         em.close(); 
    		 return ent;
    	}
    }
     
    function getImages(Offre client, EntityManager em)
    {
    tx = em.getTransaction();
    tx.begin;
        getPicks(client) ; //récupère les images du client
    tx.commit();
    em.close
    }
    C'est lors de cette transition que j'ai un " coudn't load entity"

    J'aurai tendance à dire que l’imbrication d'une transaction dans une autre ne plait pas vraiment. D'accord j'ai oublié de mettre tx.close mais la transaction est comité. Des lors je devrai pouvoir la récupérer ou ?

    Car par la suite j'aimerai mettre l'effet de transaction sur mon service via @Transactional (bien mieux pour mon atomicité), et si je ne peut pas enregistrer une image et la récupérer de suite au sein d'un même transaction, je devrai en faire deux (deux appels ihm) ou chercher une astuce.

    Si cela pourrai éclairer un esprit aiguë, je n'en manquerai pas d’intérêt

    Merci

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 85
    Par défaut
    Je propose une petite solution. Flush des images au niveau de l'update.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur "could not load entity"
    Par sousouksousouk dans le forum Spring
    Réponses: 2
    Dernier message: 30/04/2013, 11h19
  2. could not load an entity
    Par trin86 dans le forum Wildfly/JBoss
    Réponses: 2
    Dernier message: 02/05/2010, 14h51
  3. [2.0]Erreur Could not load the assembly 'App_Web_xx
    Par david_chardonnet dans le forum ASP.NET
    Réponses: 2
    Dernier message: 19/12/2006, 15h19
  4. [NHibernate]Erreur "Could not load type"
    Par benny7 dans le forum NHibernate
    Réponses: 1
    Dernier message: 04/09/2006, 15h38
  5. [FLASH MX2004] Could not load wsdl
    Par j0hnmerrick dans le forum Flash
    Réponses: 10
    Dernier message: 19/01/2005, 09h20

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