Bonjour à tous,

J'utilise Hibarente 3 et une base PostgreSQL (sans importance).

J'ai deux classes :
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 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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
<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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
Template template = new OOTemplate(new File("./Sample.odt"));
		String name = dao.save(template);
Mais il me renvoie l'exception :
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