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 ?