Я использую Hibernate для сохранения унаследованных объектов, но я получил это сообщение, когда пытался сохранить объекты в базе данных:
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
Вот классы, которые я использовал для создания таблицы:
@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 {
(...)
}
Это означает, что Hibernate ищет "виджет" таблицы, но он не создан, и это имеет смысл, потому что я выбираю параметр InheritanceType.TABLE_PER_CLASS, тогда только конкретные классы имеют таблицу. В базе данных я вижу таблицы container, text_widget и image_widget.
Затем, когда я пытаюсь выполнить этот код и сохранить контейнер, я получил указанную выше ошибку:
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);
Спасибо за вашу помощь!