1

ID とコレクションを含む hibernate でマップされたオブジェクトがあります。オブジェクトにコレクション内のアイテムが含まれているある時点で、obj.setCollection(new ArrayList())以前にコレクション内にあったアイテムをデータベースから削除したいと考えています。誰かが助けてくれれば、それは大歓迎です。問題を説明するコード:

ORM: Foo 1-* バーとバー 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 によってロードされている場合) を新しいコレクションに置き換えてはなりません。

メソッドを操作するには、常にコレクション メソッド ( addremove, 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 に答える