0

update存在しないテーブルを試行するHibernateから奇妙な例外が発生しています。以下は簡単な例です(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はこれを行うのですか?

どうもありがとう!
-テンオブカインド

4

1 に答える 1

1

関係を双方向にし、1 対多を多対 1 の逆の関係としてマッピングする必要があると思います。実際、 http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/inheritance.html#inheritance-limitationsを見ると、ポリモーフィックな一対多がinverse="true"具体的なクラスの戦略ごとに表のみに限定されます。

したがって、これを試してください:

クラス A :

@ManyToOne
@JoinColumn
private Class_C c;

クラス C :

@OneToMany(mappedBy = "c")
private List<Class_A> as;
于 2011-02-24T15:30:59.823 に答える