我是 Hibernate 的新手,我无法@OneToOne
在我们的代码中运行。
经过大量阅读,我构建了一个隔离示例,并想向社区寻求帮助。
假设 3 个类:1 个抽象(Class_A)和 2 个继承自它(Class_B / Class_C)。Class_C 有一个指向 Class_B 的单向指针。
(我已经准备了一个图表,但该网站不会让我发布它:-/)。
笔记:
- 纯 Java + Hibernate 3.6.0 Final + Oracle 11g。
- 继承策略 =每个具体类的表。
- 与
hibernate.hbm2ddl.auto=update
. - 在我们的代码中 Class_B 需要它自己的表,因此没有
@Embeddable
. - 在我们的代码中 Class_C 也是抽象的,不像这里的简化示例中所示。
代码
Class_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();
问题
在
insert(classC)
Hibernate 只发出一条 SQL 来插入 Class_C。没有用于插入 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)
vs.@OneToOne
+和有什么不一样@Cascade({CascadeType.ALL})
?
非常感谢!
- 十种