These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 
Author Message
 Post subject: Interface : peut-on ne pas les persister ?
PostPosted: Tue Oct 02, 2007 12:51 pm 
Newbie

Joined: Tue Oct 02, 2007 11:57 am
Posts: 5
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


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.