Hibernate: Как удалить в каскаде? - PullRequest
0 голосов
/ 01 марта 2011

У меня есть следующие классы:

//Product class
public class Product {
@Id
@GeneratedValue
private Long id;
private String name;

//Package Class
public class Package {
@Id
@GeneratedValue
private Long id;

@OneToOne(cascade=CascadeType.ALL)
private Product product;

private int quantity;
private char mode;
private String unity;
private String description;

@OneToOne(cascade=CascadeType.ALL)
private Usuario user;

public class User {
    @Id
    private String email;

Я могу вставить продукт, пользователя и пакет, просто делая:

    //.. (iniatilize product and user before and set in package object) 
    session.save(package);
    session.getTransaction().commit();

Так почему я не могу удалить пользователя?

    User user = new User();
    user.setEmail("valter@gmail.com");
    session.delete(user);
    session.getTransaction().commit();

Дает мне эту ошибку:

Невозможно удалить или обновить родительскую строку: сбой ограничения внешнего ключа

Что не так с моимклассы?

Законный пользователь сущности

@Entity
public class Usuario {
    @Id
    private String email;

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

}

@Entity
public class Package{
    @Id
    @GeneratedValue
    private Long id;

    @OneToOne(cascade=CascadeType.ALL)
    private Product product;

    private int quantity;
    private char mode;
    private String unity;
    private String description;

    @OneToOne(cascade=CascadeType.ALL)
    private User user;


@Entity
public class Product {
    @Id
    @GeneratedValue
    private Long id;
    private String name;

Это все сущности, вовлеченные в систему.

@ Божо На основании того, что выскажем, так и должно быть, верно?

@Entity
public class User{
    @Id
    private String email;

    @OneToOne(cascade=CascadeType.ALL)
    private List<Package> packages;

Я пытаюсь выполнить этот метод:

    private static void deleteUser() {
    Session session = new HibernateUtil().getSession();
    session.beginTransaction();

    try{

        User usuario = (Usuario) session.load(Usuario.class, "valter@gmail.com");
        session.delete(usuario);
        session.getTransaction().commit();


    }catch(HibernateException he){
        session.getTransaction().rollback();
    }finally{
        session.close();
    }
}

Ответы [ 3 ]

2 голосов
/ 01 марта 2011

Похоже, вы создаете отдельную сущность и пытаетесь удалить ее, а не извлекаете полную сущность из БД. В этом случае, даже если у вас есть определенные каскады, они не будут работать, потому что отношение сущности User не заполнено.

Если электронная почта является первичным ключом, то вы должны сделать следующее:

User user = session.load(User.class, "foo@bar.com");
session.delete(user)

Даже при этом, если какой-либо другой объект ссылается на User, он логически потерпит неудачу - просто посмотрите на ограничения базы данных. У вас есть несколько способов исправить это:

  • map List<Package> в вашем пользователе, что делает отношения двунаправленными. Таким образом, вы сможете установить каскад на сторону User
  • перед удалением пользователя найдите (по запросу) все принадлежащие ему пакеты и удалите их.
  • Если в пакете нет других каскадов, используйте HQL-запрос: DELETE FROM Package WHERE user=:user".
1 голос
/ 25 июня 2014

Вы должны добавить orphanRemoval = true.

@ OneToOne (cascade = CascadeType.ALL, orphanRemoval = true) частный пользователь Usuario;

0 голосов
/ 02 марта 2011

Попробуйте также обновить класс пакета, например

private static void deleteUser(Package package) {
Session session = new HibernateUtil().getSession();
session.beginTransaction();

try{

    User usuario = (Usuario) session.load(Usuario.class, "valter@gmail.com");
    package.setUser(null);
    session.merge(package);
    session.delete(usuario);
    session.getTransaction().commit();


}catch(HibernateException he){
    session.getTransaction().rollback();
}finally{
    session.close();
}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...