私は Hibernate が初めて@OneToOne
で、コードで機能することができません。
多くの読書の後、私は分離株の例を作成し、コミュニティの助けを求めることを考えました.
3 つのクラスがあるとします。1 つの抽象 (Class_A) と、それを継承する 2 つのクラス (Class_B / Class_C)。Class_C には、Class_B への一方向ポインタがあります。
(図を用意しましたが、サイトに掲載できません:-/)。
ノート:
- Pure Java + Hibernate 3.6.0 Final + Oracle 11g。
- 継承戦略 = Table per Concrete Class。
- で開発
hibernate.hbm2ddl.auto=update
。 - 私たちのコードでは、 Class_B は独自のテーブルを必要とするため、 no
@Embeddable
. - 私たちのコードでは、 Class_C も抽象的であり、単純化された例で示されているものではありません。
コード
クラス_A
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Class_A {
@Id
public long myId = 0;
}
Class_B
@Entity
@Table(name = "Class_B")
public class Class_B extends Class_A {
private String myString = "Hellos - I'm Class_B!";
}
Class_C
@Entity
@Table(name = "Class_C")
public class Class_C extends Class_A {
private String myString = "Hellos - I'm Class_C!";
@OneToOne(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
@NotNull
private Class_B classB;
public void setClassB(Class_B classB) {
this.classB = classB;
}
}
休止状態のコード
StatelessSession statelessSession = sessionFactory.openStatelessSession();
Class_C classC = new Class_C();
classC.myId = 92;
Class_B classB = new Class_B();
classB.myId = 8000;
classC.setClassB(classB);
statelessSession.beginTransaction();
statelessSession.insert(classC);
statelessSession.getTransaction().commit();
statelessSession.close();
問題
Hibernateでは
insert(classC)
、Class_C を挿入する SQL のみを発行します。Class_B を挿入する SQL はありません。Oracle で Class_C の詳細が表示されますが、Class_B のテーブルは空です。
SQLは次のとおりです。Hibernate: Class_C (classB_myId、myString、myId) 値 (?、?、?) に挿入します。
で
getTransaction().commit()
爆発する
これ:
java.sql.BatchUpdateException: ORA-02291: integrity constraint (NDP.FK9619CF1CAD47EF0F) violated - parent key not found
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.impl.StatelessSessionImpl.managedFlush(StatelessSessionImpl.java:333)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:133)
...
質問してください
- なぜこれが機能しないのですか...何が間違っていますか?
- レガシー コードでは、アプリケーションは一意の ID 番号を割り当て、生成された ID を使用するつもりはありません。したがって
@GenerateValue
、私たちの@Id
場合は考慮されません。これが失敗する理由ですか? - と+の違いは何
@OneToOne(cascade = CascadeType.ALL)
ですか?@OneToOne
@Cascade({CascadeType.ALL})
どうもありがとう!
- テン・オブ・ア・カインド