Bonjour,
Je cherche depuis des heures et n'arrive pas à une solution satisfaisante, je m'en remets à vous.
Résumé
En bref, je souhaiterais savoir s'il est possible de ne pas mapper une interface sur une quelconque table tout en la référençant dans les fichiers de mapping (pour garantir l'abstraction). Je n'ai ensuite besoin que de faire persister les implémentations de cette interface vers des tables.
Description du cas
Mon problème se résume ainsi :
J'ai une interface abstraite dont le seul but est de réaliser une abstraction :
Code:
public interface IVersionable {
public abstract long getId();
public abstract void setId(long id);
}
Ensuite, j'ai des implémentations de cette interface, disons par exemple une classe (je me limite à une pour faire simple, en réalité j'en ai plusieurs) :
Code:
public class VersionedTable implements IVersionable {
private long id;
// Constructeur + code spécifique
(...)
// Implémentation de l'interface
public long getId() {
return id;
}
public void setId(long id) {
this.id=id;
}
// Méthode spécifique à VersionedTable
public String getName() {
return name;
}
public void setName(String name) {
this.name=name;
}
}
Enfin, j'ai une vue qui contient des IVersionable :
Code:
public class IVersionView {
private Set<IVersionable> contents;
private long id;
public long getId() {
return id;
}
public void setId(long id) {
this.id=id;
}
public Set<IVersionable> getContents() {
return contents;
}
public void setContents(Set<IVersionable> contents) {
this.contents=contents;
}
}
Côté base de données, je souhaiterais mapper ce modèle sur 2 tables uniquement :
Code:
VERSION_VIEWS ==> VERSIONED_TABLES
view_id table_id
view_id
name
En effet, l'interface IVersionable n'apporte aucune information particulière, autre que son id.
La structure des fichiers de mappings m'imposent de définir une table spécifique pour mapper l'interface IVersionable. J'ai tenté de définir cette table (arbitrairement) sur la table VERSIONED_TABLES correspondant à la classe concrète IVersionedTable en utilisant dynamic-insert et dynamic-update mais hibernate tente alors d'effectuer 2 inserts sur la table (un pour l'interface et un pour l'implémentation).
J'en arrive à la conclusion de devoir revoir mon modèle de données :
Code:
VERSION_VIEWS ==> VERSIONABLES ==> VERSIONED_TABLES
view_id versionable_id versionable_id
view_id name
C'est à dire injecter une table VERSIONABLES qui ne sert à rien et qui possède une relation 1:1 avec VERSIONED_TABLES.
Y a-t-il un moyen de ne pas mapper une interface sur une table ?
(et donc de ne faire persister que les implémentations (via joined-subclass) ).
Merci !!!
PS : si besoin je vous envoie des fichiers de mappings, mais ils sont standards pour ce cas avec un joined-subclass pour définir l'héritage.
Hibernate version:
3.2.5