休眠级联类型删除父级

MCh*_*han 5 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>();
}
Run Code Online (Sandbox Code Playgroud)

现在,我面临一个问题,每当删除任何子记录(城市)时,父国家/地区也会被删除。

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

那么有人可以建议我在这里到底在做什么错吗?以及当我删除城市时,如何将其删除而没有其父国家/地区?

谢谢你的时间

Kev*_*sox 4

country从实体上的字段中删除级联City。该元素指定当对实体执行操作时应该对实体执行cascade哪些持久化操作。CountryCity

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;
}
Run Code Online (Sandbox Code Playgroud)

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

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;
}
Run Code Online (Sandbox Code Playgroud)

还要确保您没有对数据库中的外键指定级联删除。