Hello, I have a problem with entity relationships and foreign key constraints. I want to get all child entities deleted when the parent entity is deleted. Therefore I used the CasecadeType.REMOVE, but it doesn't work.
Here is code fragment: | @Entity | @Table(name = "Users") | public class User implements Serializable { | | private int id; | | private List<ChatMessage> sentChatMessages; | private List<ChatMessage> receivedChatMessages; | | @Id | @GeneratedValue(strategy = GenerationType.IDENTITY) | @Column(name = "id", updatable = false, nullable = false) | public int getId() { | return id; | } | | @OneToMany(mappedBy = "sender", cascade = {CascadeType.REMOVE}, fetch = FetchType.LAZY) | public List<ChatMessage> getSentChatMessages() { | return this.sentChatMessages; | } | | public void setSentChatMessages(List<ChatMessage> sentChatMessages) { | this.sentChatMessages = sentChatMessages; | } | | @OneToMany(mappedBy = "receipient", cascade = {CascadeType.REMOVE}, fetch = FetchType.LAZY) | public List<ChatMessage> getReceivedChatMessages() { | return this.receivedChatMessages; | } | | public void setReceivedChatMessages(List<ChatMessage> receivedChatMessages) { | this.receivedChatMessages = receivedChatMessages; | } | } | | @Entity | @Table(name = "ChatMessages") | public class ChatMessage implements Serializable { | | private User sender; | | private User receipient; | | private String message; | | @ManyToOne() | @JoinColumn(name = "sender", referencedColumnName = "id", nullable = false) | public User getSender() { | return this.sender; | } | | public void setSender(User sender) { | this.sender = sender; | } | | @ManyToOne() | @JoinColumn(name = "receipient", referencedColumnName = "id", nullable = false) | public User getReceipient() { | return this.receipient; | } | | public void setReceipient(User receipient) { | this.receipient = receipient; | } | } | When I try to delete a user, I exspect that all his messages are also deleted, but this does not happen. Instead I get the following exception: 12:12:43,703 ERROR [JDBCExceptionReporter] ERROR: update or delete on "users" violates foreign key constraint "fk278c74e4eedef195" on "chatmessages" Detail: Key (id)=(12) is still referenced from table "chatmessages". 12:12:43,703 ERROR [AbstractFlushingEventListener] Could not synchronize database state with session 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:249) at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:92) at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:87) at org.hibernate.jdbc.AbstractBatcher.prepareBatchStatement(AbstractBatcher.java:218) at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:2414) at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:2632) at org.hibernate.action.EntityDeleteAction.execute(EntityDeleteAction.java:73) at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:248) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:232) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:144) 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.ejb.AbstractEntityManagerImpl$1.beforeCompletion(AbstractEntityManagerImpl.java:515) at org.jboss.tm.TransactionImpl.doBeforeCompletion(TransactionImpl.java:1491) at org.jboss.tm.TransactionImpl.beforePrepare(TransactionImpl.java:1110) at org.jboss.tm.TransactionImpl.commit(TransactionImpl.java:324) at org.jboss.tm.TxManager.commit(TxManager.java:240) at org.jboss.aspects.tx.TxPolicy.endTransaction(TxPolicy.java:175) at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:87) at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:191) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:76) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) at org.jboss.ejb3.stateless.StatelessInstanceInterceptor.invoke(StatelessInstanceInterceptor.java:62) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) at org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:77) at org.jboss.ejb3.security.Ejb3AuthenticationInterceptor.invoke(Ejb3AuthenticationInterceptor.java:102) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:47) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) at org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) at org.jboss.ejb3.stateless.StatelessContainer.dynamicInvoke(StatelessContainer.java:263) at org.jboss.aop.Dispatcher.invoke(Dispatcher.java:106) at org.jboss.aspects.remoting.AOPRemotingInvocationHandler.invoke(AOPRemotingInvocationHandler.java:82) at org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:828) at org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:681) at org.jboss.remoting.transport.socket.ServerThread.processInvocation(ServerThread.java:358) at org.jboss.remoting.transport.socket.ServerThread.dorun(ServerThread.java:412) at org.jboss.remoting.transport.socket.ServerThread.run(ServerThread.java:239) Caused by: java.sql.BatchUpdateException: Batch-Eintrag 0 delete from Users where id=12 wurde abgebrochen. Rufen Sie getNextException auf, um die Ursache zu erfahren. at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2478) at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1298) at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:347) at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2540) at org.jboss.resource.adapter.jdbc.WrappedStatement.executeBatch(WrappedStatement.java:519) at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48) at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:242) ... 41 more What can I do? I tried to remove all user's messages with the entityManager before removing the user, but I had no luck. I use JBoss 4.0.5 and a Postgres 8.1 database. View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4029741#4029741 Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4029741 _______________________________________________ jboss-user mailing list jboss-user@lists.jboss.org https://lists.jboss.org/mailman/listinfo/jboss-user