2015-03-04 4 views
1

В отношениях «Один-ко-многим», как я могу удалить дочерний элемент без необходимости поиска и загрузки родителя, удаления элемента, обновления родителя, ТОГДА удалить ребенка? Для иллюстрации моей проблемы, у меня есть два класса Foo (родитель) и Дон (ребенок Дон):Удалить ребенка из отношения @OneToMany

@Entity 
public class Foo { 
    @Id 
    @GeneratedValue 
    private int id; 

    @OneToMany 
    private List<Don> dons; 

    public int getId() { 
     return id; 
    } 

    public List<Don> getDons() { 
     // (loads dons as because lazy loading) 
     return dons; 
    } 
} 

@Entity 
public class Don { 
    @Id 
    @GeneratedValue 
    private int id; 

    public int getId() { 
     return id; 
    } 
} 

Если у меня есть экземпляр Дона с несколько Foos со ссылкой на него, я получаю следующее исключение:

Cannot delete or update a parent row: a foreign key constraint fails

Я знаю, что могу удалить экземпляр из Foo, но есть способ, чтобы удалить донские экземпляры, не находя FOOS? (По производительности)

+0

привет, если я не ошибаюсь, вы хотите удалить только одну запись «Дон» прямо? Могу ли я знать, что вы нашли свое решение? У меня такая же проблема. Желаю, чтобы вы могли поделиться со мной :) – Chang

ответ

1

Я думаю, что ваша ситуация должна быть: удалить Foos экземпляр с несколькими Dons со ссылкой на него

Вы можете добавить cascade атрибут, то при удалении Foos экземпляра, связанные Dons экземпляры будут автоматически удалены без объяснения ForeignKey ошибки:

@OneToMany(cascade = {CascadeType.ALL}) 
private List<Don> dons; 
+0

Если бы это было так, это сработало бы. В моем случае, однако, я пытаюсь удалить дон-инстанции, а не foos. – Martin

1

Как указано в this пост, двунаправленная привязка требуется для того, чтобы DELE т. е. объект. Добавив ссылку от Don to Foo, аннотированную с @ManyToOne, и добавил mappedBy = "parent" в Foo.dons, решил мою проблему. Окончательный код:

@Entity 
public class Foo { 
    @Id 
    @GeneratedValue 
    private int id; 

    // Added mapped by, which refers to Don.parent 
    @OneToMany(mappedBy = "parent") 
    private List<Don> dons; 

    public int getId() { 
     return id; 
    } 

    public List<Don> getDons() { 
     // (loads dons as because lazy loading) 
     return dons; 
    } 
} 

@Entity 
public class Don { 
    @Id 
    @GeneratedValue 
    private int id; 

    // Added parent 
    @ManyToOne 
    private Foo parent; 

    public int getId() { 
     return id; 
    } 

    // Remember to set parent, otherwise we will loose the reference in the database. 
    public void setParent(Foo parent) { 
     this.parent = parent; 
    } 
} 
Смежные вопросы