2013-08-15 3 views
2

У меня есть следующие два объекта домена в моем приложении: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>(); 
} 

Теперь я столкнулся с проблемой, что всякий раз, когда я удалить какие-либо из дочерних записей (города) Родитель страна также удаляется.

Так например, если у меня есть страна США, у которой есть два города (Нью-Йорк) и (Калифорния), теперь, если я решил удалить (Нью-Йорк), я обнаружил, что (Калифорния) и (США) также удалены! Это неправильно ... поэтому после некоторых исследований я обнаружил, что проблема связана с каскадом, который я использую, но не понял, что именно я делаю неправильно.

Так может кто-нибудь угодить совету, что именно я делаю неправильно здесь? и как, когда я удаляю город, я получаю его только без родительской страны?

Спасибо за ваше время

ответ

2

Удалить каскад из 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; 
} 

Также убедитесь, что вы не указали каскадное удаление внешнего ключа в базе данных.

+0

Большое спасибо за подробный ответ .... вы сказали: «Также убедитесь, что вы не указали каскадное удаление внешнего ключа в базе данных», можете ли вы прокомментировать эту часть? Классы FK в City и Country - это поле id, и я не упоминал о каком-либо каскаде, или вы ссылаетесь на другое место, чтобы определить каскадное FK - удалить? – MChan

+0

Когда вы создаете свою схему в базе данных, внешние ключи имеют каскадную настройку, которая может привести к удалению. –

Смежные вопросы