【发布时间】:2014-02-22 18:49:18
【问题描述】:
我在使用@ManyToOne 进行级联删除时遇到了很大的问题。我有两个类:用户(从“一”端)和地址(从“多”端),我的问题是:
-当删除与用户关联的地址实体时(用户当然有许多关联的地址),不仅从数据库中删除了一条地址记录,而且他的所有者=用户。更重要的是 - 与该用户关联的所有地址也被删除:(
-所以,这不是我所期望的,谁能告诉我,我做错了什么?
用户类
public class User implements Serializable{
@Column(name="id")
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Integer getId() {
return id;
}
private Set<Adress> adresses;
@OneToMany(mappedBy = "user", cascade=CascadeType.ALL)
public Set<Adress> getAdresses() {
return adresses;
}
...
}
单元类
@Entity
@Table(name="unit")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name="unit_type", discriminatorType = DiscriminatorType.STRING)
public class Unit implements Serializable {
private Integer id;
@Id
@Column(name="id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Integer getId() {
return id;
}
}
地址类
@DiscriminatorValue("adr")
public class Adress extends Unit implements Serializable {
private User user;
@ManyToOne
@JoinColumn(name="adress_id")
public User getUser(){
return user;
}
...
}
AdressDaoImpl 类的一部分:
public void delete(Adress adress) {
Adress mergedWithContextAdress = entityManager.merge(adress);
entityManager.remove(mergedWithContextAdress);
logger.info("Adress removed.");
}
AdressDaoTest 类的部分:
Adress adress = adressDao.findById(1);
adressDao.delete(adress);
【问题讨论】:
-
你能显示你正在删除的代码吗?
-
你有没有 XML 映射文件,还是只使用注解?
-
我没有 XML,只使用了注解。
-
这段代码看起来不错,所以问题一定出在您没有显示的部分代码上。您是否在同一事务中执行其他操作?您的实体中有
@Id字段吗?如果你这样做,请给他们看。 -
好吧,我之前做了一些简化。如您所见,Address 继承自 Unit 及其 Id 字段。