将集合设置为'new ArrayList()'时级联hibernate删除

时间:2011-01-24 09:47:11

标签: java hibernate collections cascading-deletes

我有一个用hibernate映射的对象,它包含一个id和一个集合。在对象包含其集合中的项目的某个时间点,我想要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 个答案:

答案 0 :(得分:3)

您可能想要做的是:

obj.getCollection().clear();

答案 1 :(得分:3)

你永远不应该用新的集合替换Hibernate管理的集合(例如,如果你有一个包含集合的对象,并且这个对象由Hibernate加载)!

始终使用收集方法(addremove, clear,...)来操作该方法。

答案 2 :(得分:1)

如果您希望Hibernate在从集合中删除对象时从数据库中删除对象,则需要为该集合配置delete-orphan选项:

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

虽然在这种情况下您无法替换集合,但您需要使用集合方法(请参阅Ralph的答案和remove collection with delete-orphan not work with null assignment? :(

答案 3 :(得分:0)

或类似的东西(我喜欢封装字段):

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);
    }
}