Каскадное удаление из спящего режима при установке коллекции в 'new ArrayList ()' - PullRequest
1 голос
/ 24 января 2011

У меня есть объект, сопоставленный с Hibernate, который содержит идентификатор и коллекцию.В какой-то момент времени, когда объект содержит элементы в своей коллекции, я хочу сделать obj.setCollection(new ArrayList()), и он должен удалить элементы из базы данных, которые были ранее в коллекции.Если кто-то может помочь, это будет очень ценно.Код для иллюстрации проблемы:

ORM: Foo 1- * Bar and Bar 1-1 Foo

class Foo {
    Long id;
    List<Bar> bars;

    //getters & setters
}

<hibernate-mapping>
    <class name="domain.Foo" table="Foos">
        <id name="id" type="long" column="id">
            <generator class="native" />
        </id>
        <list name="bars" lazy="true" cascade="all">
            <key column="FOO_ID" not-null="true" />
            <index column="SEQUENCE" />
            <one-to-many class="domain.Bar" />
        </list>     
    </class>    
</hibernate-mapping>

@Entity
@Table(name="Bars")
public class Bar {
    private Long id;
    private Foo foo;
    private String name;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="ID")
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @ManyToOne
    @JoinColumn(name="FOO_ID", insertable=false, updatable=false)
    public Foo getFoo() {
        return foo;
    }

    public void setFoo(Foo foo) {
        this.foo = foo;
    }

    @Column(name="NAME")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Ответы [ 4 ]

3 голосов
/ 24 января 2011

Никогда не следует заменять коллекцию, управляемую Hibernate (например, если у вас есть объект, содержащий коллекцию, и этот объект загружается Hibernate) новой коллекцией!

Всегда используйте методы коллекции (add, remove, clear, ...) для управления методом.

3 голосов
/ 24 января 2011

Что вы, вероятно, хотите сделать, это:

obj.getCollection().clear();
1 голос
/ 24 января 2011

Если вы хотите, чтобы Hibernate удалял объекты из базы данных при удалении их из коллекции, вам нужно настроить параметр delete-orphan для этой коллекции:

<list name="bars" lazy="true" cascade="all-delete-orphan">

Хотя в этом случае вы не можете заменить коллекцию, вам нужно вместо этого использовать методы коллекции (см. Ответ Ральфа и удалить коллекцию с помощью delete-orphan, который не работает с нулевым присваиванием?

0 голосов
/ 24 января 2011

Или как-то так (мне нравится инкапсулировать поля):

class Foo {
    Long id;
    List<Bar> bars = new ArrayList<Bar>();

    ...

    public List<Bar> getBars() {
        return new ArrayList<Bar>(bars);
    }

    public void setBars(List<Bar> newBars) {
        bars.clear();
        bars.addAll(newBars);
    }

    public void addBar(Bar bar) {
        bars.add(bar);
    }

    public void removeBar(Bar bar) {
        bars.remove(bar);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...