Hibernate et à l'Héritage (TABLE_PER_CLASS)

J'utilise Hibernate persister des objets hérités, mais j'ai eu ce message quand j'essaie de conserver les objets dans la base de données:

org.springframework.dao.InvalidDataAccessResourceUsageException: Could not execute
JDBC batch update; SQL [update Widget set CONTAINER_ID=? where WIDGET_ID=?]; nested 
exception is org.hibernate.exception.SQLGrammarException: 
Could not execute JDBC batch update (...) Caused by: java.sql.BatchUpdateException: Table 
'schema.widget' doesn't exist

Voici les classes que j'ai utilisé pour générer la table:

@Entity
@Table(name="CONTAINER")
public class Container {
     (...)
     private Set<Widget> widgets;

     @OneToMany(targetEntity = Widget.class)
     @JoinColumn(name="CONTAINER_ID", nullable=true)
     public Set<Widget> getWidgets() {
         return widgets;
     }

     public void setWidgets(Set<Widget> widgets) {
         this.widgets = widgets;
     }
}


@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class Widget {
     private long id;
     private int position;

     @Id
     @GeneratedValue(strategy = GenerationType.TABLE)
     @Column(name="WIDGET_ID")
     public long getId() {
         return id;
     }

     public void setId(long id) {
         this.id = id;
     }

     @Column(name="POSITION")
     public int getPosition() {
         return position;
     }

     public void setPosition(int position) {
         this.position = position;
     }
}


@Entity
@Table(name="TEXT_WIDGET")
public class TextWidget extends Widget {
     (...)
}


@Entity
@Table(name="IMAGE_WIDGET")
public class ImageWidget extends Widget {
     (...)
}

Donc, cela signifie que Hibernate est à la recherche de la table 'widget', mais elle n'est pas créé et qui ont du sens parce que j'ai choisi InheritanceType.TABLE_PER_CLASS option, puis seulement les classes concrètes avoir une table. Dans la base de données, je peux voir conteneur, text_widget et image_widget tables.

Puis, quand j'essaie d'exécuter ce code et enregistrer conteneur, puis j'ai eu l'erreur ci-dessus:

Set<Widget> widgets = new HashSet<Widget>();
widgets.add(textw1); //instance of TextWidget
widgets.add(imgw1); //instance of ImageWidget

Container container1 = new Container();
container1.setWidgets(widgets);

Merci pour votre aide!

OriginalL'auteur Romain | 2010-08-24