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
Vous devez vous connecter pour publier un commentaire.
Votre association doit être bidirectionnel, comme mentionné dans la documentation Hibernate.
De cette façon, Hibernate va être en mesure de créer des colonne de clé étrangère dans chaque béton widget de tableau. Voici une cartographie qui fonctionne réellement. Pour le
Container
:Et de l'abstrait classe de Widget:
Et la suite de la méthode d'essai (en cours d'exécution à l'intérieur d'une transaction) cols:
Et génère le code SQL suivant:
Mais gardez à l'esprit que la d'une table par classe stratégie fournit le soutien des pauvres pour polymorphes relations et pourrait ne pas être appropriée à tous si vous avez beaucoup de
Widget
enfant (il en résulte d'énormes SQL UNION).Liés à la question
OriginalL'auteur Pascal Thivent