Я новичок в 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. Нет SQL для вставки Class_B. Я вижу подробности Class_C в Oracle, но таблица 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)
...
Вопросы, пожалуйста
- Почему это не работает ... что я делаю не так?
- В нашем традиционном коде приложение распределяет уникальные номера идентификаторов и не собирается использовать сгенерированные идентификаторы. Таким образом,
@GenerateValue
для нашего @Id
не считается. Это причина, почему это не удается?
- В чем разница между
@OneToOne(cascade = CascadeType.ALL)
и @OneToOne
+ @Cascade({CascadeType.ALL})
?
Большое спасибо!