2013-05-30 1 views
1

У меня есть один-ко-многим:Hibernate, JPA не могу удалить один-ко-многим

@Entity 
@Table(name = "Users") 
public class User { 

    @Id 
    @Column(name = "user_id", nullable = false) 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Integer id; 

    @Column(name = "login", nullable = false) 
    private String login; 

    @Column(name = "password", nullable = false) 
    private String password; 

    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "role_id", nullable = false) 
    private Role role; 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "user", cascade = javax.persistence.CascadeType.ALL) 
    private Set<Contacts> contacts = new HashSet<Contacts>(); 

И я пытаюсь удалить User объект со всеми Контакты; Я пытался использовать:

  1. cascade = javax.persistence.CascadeType.ALL
  2. cascade = javax.persistence.CascadeType.REMOVE

  3. @Cascade(CascadeType.DELETE) из org.hibernate.annotations

  4. @Cascade(CascadeType.DELETE_ORPHAN) из org.hibernate.annotations

но nothi помогли. Я всегда получаю исключение:

org.hibernate.util.JDBCExceptionReporter - Невозможно удалить или обновить родительскую строку:. Ограничение внешнего ключа не удается (contactmanagercontact, скованность contact_ibfk_1 FOREIGN KEY (user_id) Лит

UPD Код, который удаляет пользователя выглядит следующим образом:

@Transactional 
public void removeUser(User user) { 
    sessionFactory.getCurrentSession().delete(user); 
} 

Буду признателен за любую помощь! Благодарю.

+0

Вы пытались установить 'orphanRemoval = true' в отношении' OneToMany'? Кроме того, как вы пытаетесь удалить записи? – DannyMo

+0

Да, я. Но по какой-то причине Maven сказал мне: «Атрибут orphanRemoval не определен для типа аннотации OneToMany». –

+0

'orphanRemoval' был представлен в JPA 2.0, поэтому, если вы используете более старую версию, которая объясняет, почему она не определена. 'orphanRemoval' всегда работает для меня на аналогичных отношениях (с использованием eclipselink). Это похоже на то, что 'CascadeType.DELETE_ORPHAN' является Hibernate-специфическим (и устаревшим) эквивалентом' orphanRemoval', поэтому я не уверен, почему он не работает для вас. Последняя мысль состоит в том, чтобы убедиться, что у вас есть 'equals' и' hashCode' [правильно определены] (http://docs.jboss.org/hibernate/core/4.0/manual/en-US/html/persistent-classes.html # настойчивые-классы-equalshashcode). – DannyMo

ответ

0

Моей рекомендацией здесь было бы сделать управление взаимоотношениями самостоятельно. Каскадные удары могут быть сложными (особенно в ситуации, подобной вашей, где владелец ваших двунаправленных отношений не является тем, кто объявляет каскад), и часто бывает довольно опасным, поэтому я обычно предпочитаю их избегать. Особенно, если вы используете версию JPA pre-2.0, тогда у вас нет слишком большого выбора. Я бы просто изменил способ удаления на что-то вроде:

@Transactional 
public void removeUser(User user) { 
    Set<Contacts> contacts = user.getContacts(); 

    for (Contact contact : contacts) { 
     sessionFactory.getCurrentSession().delete(contact); 
    } 

    contacts.clear(); 
    sessionFactory.getCurrentSession().delete(user); 
} 
Смежные вопросы