Hallo,
ich versuche aus einer 1:1-Beziehung eine der beiden Entitäten zu löschen. Ich benutze JPA bzw. die HibernateAnnotations-Implementation von JPA.
Hibernate version:
Hibernate Core 3.2.4 SP1, Hibernate Annotation 3.3.0 GA, Hibernate EntityManager 3.3.1 GA
Mapping documents:
@Entity
public class A {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Basic(optional=true)
@OneToOne(cascade=CascadeType.ALL)
private B b;
}
@Entity
public class B {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Basic(optional=false)
@OneToOne(mappedBy = "b")
private A a;
}
Code between em.getTransaction().begin() and em.getTransaction().commit():
b = em.find(B.class, b.getId());
a = b.getB();
b.setA(null);
em.remove(a);
Full stack trace of any exception that occurs:
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:253)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:237)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:146)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:54)
... 20 more
Caused by: java.sql.BatchUpdateException: Cannot delete or update a parent row: a foreign key constraint fails (`database/a`, CONSTRAINT `FK` FOREIGN KEY (`b_id`) REFERENCES `b` (`id`))
at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1237)
at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:936)
at org.apache.tomcat.dbcp.dbcp.DelegatingStatement.executeBatch(DelegatingStatement.java:294)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246)
... 28 more
Name and version of the database you are using:
MySql 5
Eigentlich würde ich ja erwarten, dass ENTWEDER das Entfernen der einzigen Referenz auf ein Objekt die Entität aus der DB löscht, ODER das Entfernen der Entität mit EntityManager.remove(B) auch die Referenz auf B in A löscht. Aber leider klappt es noch nicht einmal, wenn ich zur Sicherheit beides zusammen ausführe.
Ich vermute, dass das Setzen der Referenz auf
Code:
null
mit
Code:
a.setB(null)
keine Wirkung hat. Vielleicht denkt Hibernate sich, dass null gleichbedeutend ist mit "Bitte keine Änderung vornehmen". Kann man das irgendie einschalten?
Hat jemand Ideen? Bin für alles dankbar.
Gruß,
Matthias