Bonjour à tous,
J'utilise Hibarente 3 et une base PostgreSQL (sans importance).
J'ai deux classes :
Code:
public abstract class Template {
...
public Image getThubmnlail() { .. }
...
}
public class OOTemplate extends Template {
public OOTemplate(File file) {
parse(file);
}
private void parse(File file) {
// Lecture du fichier OpenOffice pour charger certains paramètres
// dont l'image thumbnail
}
}
La sous classe
OOTemplate n'a une utilité que pour le développeur car elle lis un fichier OpenOffice pour récupérer des informations. Mais elle n'ajoute pas de méthode ni de propriétés.
Je veux persister
Template j'ai donc écris le mapping qui vas bien :
Code:
<hibernate-mapping>
<class name="moi.truc.Template" table="templates">
<id name="name" type="string" length="25"><generator class="assigned" /></id>
<property name="description" type="string" />
<property name="thumbnail"
type="moi.truc.dao.impl.hibernate.usertypes.ImageUserType"/>
</class>
</hibernate-mapping>
Dans mon test j'ai le code suivant :
Code:
Template template = new OOTemplate(new File("./Sample.odt"));
String name = dao.save(template);
Mais il me renvoie l'exception :
Quote:
Caused by: org.hibernate.MappingException: Unknown entity: moi.truc.OOTemplate
at org.hibernate.impl.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:550)
at org.hibernate.impl.SessionImpl.getEntityPersister(SessionImpl.java:1338)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:98)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:187)
at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:172)
at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:535)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:523)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:519)
at org.springframework.orm.hibernate3.HibernateTemplate$12.doInHibernate(HibernateTemplate.java:693)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:419)
... 22 more
Pour m'en sortir, j'ai tenté de rajouter
<subclass> avec un discriminant dans mon mapping mais il veux alors instantier le type
OOTemplate or, comme je l'ai dis plus haut, OOTemplate n'apporte rien d'autre qu'une facilitié de création d'un
Template depuis un objet
File (il est d'ailleurs caché par une Factory dans l'application). Je n'ai docn aucun intérête à faire une différence entre Template et OOTemplate pour la persistence
Comment faire alors pour persister OOTemplate en tant que Template ?
Merci