2011-12-02 46 views
0

我有以下屬性定義:Hibernate的多對多與JoinTable刪除傳播

@Entity 
@Table(name = "person") 
public class Person extends AbstractEntity { 

    @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    @Cascade({ org.hibernate.annotations.CascadeType.ALL }) 
    @JoinTable(name = "person_unit", joinColumns = { @JoinColumn(name = "person_id") }, inverseJoinColumns = { @JoinColumn(name = "unit_id") }) 
    private Set<OrgUnit> units; 

} 

其中refences的OrgUnit類,被定義爲:

@Entity 
@Table(name = "orgunit", uniqueConstraints = { @UniqueConstraint(columnNames = { 
     "parentunit_id", "name" }) }) 
public class OrgUnit extends AbstractEntity { 
    ... 
} 

現在,當我嘗試刪除Person ,它應該只刪除personperson_unit表中的行。而是休眠似乎嘗試刪除鏈接OrgUnit爲好,因爲我得到了以下錯誤消息:

2011-12-02 10:52:30,527 WARN [ajp-2009-2] JDBCExceptionReporter: SQL Error: 547, SQLState: 23000 
2011-12-02 10:52:30,527 ERROR [ajp-2009-2] JDBCExceptionReporter: The DELETE statement conflicted with the REFERENCE constraint 'FKE6A2C42EB024FBA5'. The conflict occured in database TEST, table 'TEST.person_unit', column 'unit_id'. 
2011-12-02 10:52:30,527 ERROR [ajp-2009-2] AbstractFlushingEventListener: Could not synchronize database state with session 
org.hibernate.exception.ConstraintViolationException: could not delete: [<-- snip -->.server.entities.OrgUnit#337] 
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:96) 
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) 
    at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:2712) 
    at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:2895) 
    at org.hibernate.action.EntityDeleteAction.execute(EntityDeleteAction.java:97) 
    at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:267) 
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:259) 
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:183) 
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321) 
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51) 
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1206) 
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:375) 
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137) 
    at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:656) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723) 
    at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:147) 
    at <-- snip -->.server.controller.PersonController.deletePerson(PersonController.java:60) 

我在做什麼錯在這裏?

回答

1

是的,它傳播的缺失,因爲你告訴它

@Cascade({ org.hibernate.annotations.CascadeType.ALL}) 

ALL包括REMOVE做到這一點。它不應該用於ManyToXxx關聯。

+0

謝謝,我沒有看到它,即使它正在凝視我的臉... – nfechner