我有一个用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;
}
}
答案 0 :(得分:3)
您可能想要做的是:
obj.getCollection().clear();
答案 1 :(得分:3)
你永远不应该用新的集合替换Hibernate管理的集合(例如,如果你有一个包含集合的对象,并且这个对象由Hibernate加载)!
始终使用收集方法(add
,remove,
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);
}
}