Hibernate级联类型删除父级

时间:2013-08-15 00:30:50

标签: java hibernate

我的应用程序中有以下两个域实体:

public class City {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="CITY_ID")
private Long id;

@Column(name="CITY_NAME",length=20,nullable=false,unique=false)
private String cityName;

@ManyToOne(cascade={CascadeType.ALL})
@JoinColumn(name="COUNTRY_ID",nullable=false)
private Country country;
}



public class Country {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="COUNTRY_ID")
private Long id;

@Column(name="COUNTRY_NAME",length=20,nullable=false,unique=false)
private String countryName;

@OneToMany(mappedBy="country",cascade=CascadeType.ALL)
private Set<City> cities=new HashSet<City>();
}

现在我遇到的问题是,每当我删除任何子记录(城市)时,父国家也会被删除。

例如,如果我有美国国家有两个城市(纽约)和(加利福尼亚州),现在如果我决定删除(纽约),我发现(加利福尼亚州)和(美国)也被删除了!这是错误的...所以经过一些研究后我发现问题与我正在使用的Cascade有关,但没有弄清楚我到底做错了什么。

那么有人可以在这里建议我到底做错了什么吗?以及当我删除某个城市时,我只会在没有其母国的情况下将其删除?

感谢您的时间

1 个答案:

答案 0 :(得分:4)

country实体的City字段中删除级联。 cascade元素指定在Country实体上执行操作时应在City实体上执行的持久性操作。

public class City {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="CITY_ID")
private Long id;

@Column(name="CITY_NAME",length=20,nullable=false,unique=false)
private String cityName;

@ManyToOne
@JoinColumn(name="COUNTRY_ID",nullable=false)
private Country country;
}

如果您仍需要级联其他操作,则需要在数组中指定每个操作。

public class City {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="CITY_ID")
private Long id;

@Column(name="CITY_NAME",length=20,nullable=false,unique=false)
private String cityName;

@ManyToOne(cascade={CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.MERGE})
@JoinColumn(name="COUNTRY_ID",nullable=false)
private Country country;
}

还要确保未在数据库中的外键上指定级联删除。