层叠休眠设置集合时删除“新的ArrayList()

我有一个包含一个ID和一个集合映射的Hibernate对象。 在某个时间点时,对象包含的项目,在它的收藏我想做obj.setCollection(new ArrayList())并把它删除集合中的以前数据库的项目。 如果任何人都可以协助,将不胜感激。 代码来说明问题:

ORM:美孚1 *酒吧和酒吧1-1美孚

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

--------------解决方案-------------

如果你想休眠,当你从集合中删除他们从数据库中删除对象,你需要配置delete-orphan为收集选项:

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

尽管在这种情况下,你不能代替的采集,你需要使用的采集方法来代替(见拉尔夫的答案,并与删除孤儿删除收集与空分配工作?:()

你可能想要做的是:

obj.getCollection().clear();

你不应该取代休眠manged集合(例如,如果您有一个包含集合的对象,这个对象是由Hibernate来加载)由一个新的集合!

始终使用征收方式( addremove, clear ,...)来操纵方法。

或者是这样的(我喜欢封装字段):

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

分类:java的 时间:2015-03-16 人气:32
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.757 (s). 11 q(s)