Мы получили странное исключение из Hibernate, пытающегося update
несуществующую таблицу.Ниже приведен простой пример ( Hibernate 3.6.0 Final + Oracle 11g + Pure Java ).
Здесь Class_A является абстрактным в стратегии иерархии TABLE_PER_CLASS (таблица для конкретного класса).Вот простая версия, скажите, пожалуйста, что не так с нашим кодом:
Class_A
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Class_A {
@Id
@Column(name="blabla")
public long myId = 0;
}
Class_B
@Entity
public class Class_B extends Class_A {
private String myString = "Hellos - I'm Class_B!";
}
Class_C
@Entity
public class Class_C extends Class_A {
private String myString = "Hellos - I'm Class_C!";
@OneToMany(cascade=CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn
@OrderColumn(name="list_order")
public List<Class_A> as;
}
Код
Class_C c = new Class_C();
c.myId = 92;
Class_B b = new Class_B();
b.myId = 10;
List<Class_A> bs = new ArrayList<Class_A>();
bs.add(0, b);
c.as = bs;
Session session = sessionFactory.openSession();
session.beginTransaction();
session.save(c);
session.getTransaction().commit();
session.close();
Авария
В commit()
, Hibernate пытается это SQL:
Hibernate: update Class_A set as_blabla=?, list_order=? where blabla=?
Затем происходит сбой:
java.sql.BatchUpdateException: ORA-00942: table or view does not exist
at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:17660)
at oracle.jdbc.driver.OracleStatementWrapper.executeBatch(OracleStatementWrapper.java:771)
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeBatch(NewProxyPreparedStatement.java:1723)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:268)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:188)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:383)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:133)
Почему Hibernate делает это?
Большое спасибо!
- Десятка