Hibernate ManyToMany с JoinTable удаляет распространение - PullRequest
0 голосов
/ 02 декабря 2011

У меня определено следующее свойство:

@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;

}

, который ссылается на класс OrgUnit, который определяется как:

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

Теперь, когда я пытаюсь удалить Person, он должен удалять только строки из таблиц person и person_unit. Но вместо этого, похоже, Hibernate пытается удалить связанный 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 Ответ

1 голос
/ 02 декабря 2011

Да, это распространяется на удаление, потому что вы сказали сделать это с

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

ALL включает REMOVE.Он никогда не должен использоваться в ассоциациях ManyToXxx.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...