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:
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:
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:
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:
<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:
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:
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:
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 ?