1

我有一个用 hibernate 映射的对象,其中包含一个 id 和一个集合。在某个时间点,当对象包含其集合中的项目时,我想做obj.setCollection(new ArrayList())并让它从数据库中删除以前在集合中的项目。如果有人可以提供帮助,将不胜感激。说明问题的代码:

ORM:Foo 1-* Bar 和 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

4 回答 4

3

您可能想要做的是:

obj.getCollection().clear();
于 2011-01-24T09:48:48.877 回答
3

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

始终使用集合方法 ( add, remove, clear, ...) 来操作方法。

于 2011-01-24T10:51:25.937 回答
1

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

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

尽管在这种情况下您无法替换集合,但您需要改用集合方法(请参阅 Ralph 的回答并使用 delete-orphan 删除集合不适用于 null 赋值?:(

于 2011-01-24T13:38:00.037 回答
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);
    }
}
于 2011-01-24T10:02:44.180 回答