我的应用程序中具有以下两个域实体:
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有关,但没有弄清楚我到底在做什么错。
那么有人可以建议我在这里到底在做什么错吗?以及当我删除城市时,如何将其删除而没有其父国家/地区?
谢谢你的时间
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)
还要确保您没有对数据库中的外键指定级联删除。