2014-05-06 182 views
0

我目前面臨以下問題:我有countriescities之間的關係。如你所想,這種關係相當簡單,country可以有多個cities,而city只屬於一個country。一旦我刪除country我想保留我的數據庫中存在的cities父母被刪除時保留孩子

我的域模型看起來如下:

國家

@Entity 
@Table(name = "COUNTRIES") 
public class Country extends BaseEntity { 
    private String name; 
    private Set<City> cities = new HashSet<>(); 

    @Column(name = "NAME", length = 80, nullable = false, unique = true) 
    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "country", cascade = CascadeType.ALL) 
    public Set<City> getCities() { 
     return cities; 
    } 

    public void setCities(Set<City> cities) { 
     this.cities = cities; 
    } 
} 

@Entity 
@Table(name = "CITIES") 
public class City extends BaseEntity { 

    private String name; 
    private Country country; 

    @Column(name = "NAME", length = 120, nullable = false) 
    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "COUNTRY_ID", nullable = true) 
    public Country getCountry() { 
     return country; 
    } 

    public void setCountry(Country country) { 
     this.country = country; 
    } 
} 

只是爲了您的信息,BaseEntity只需保持主鍵以及實體創建時的信息或改性。

如何從數據庫中刪除某個國家時,我的城市不會被刪除?

回答

2

更換cascade = CascadeType.ALL

@OneToMany(fetch = FetchType.LAZY, mappedBy = "country", cascade = CascadeType.ALL) 
    public Set<City> getCities() { 
     return cities; 
    } 
+0

cascade = { CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH } 

,我試過了,它看起來很有希望,但一旦我刪除一個國家,我收到DataIntegrityViolationException因爲外鍵沒有相應的條目。所以我想我需要告訴Hibernate將'CITY.COUNTRY_ID'設置爲null或-1? (僅供參考:'City'中的'@ JoinColumn'屬性具有'nullable = true')。 – mhmpl

+1

@mhp這可能是由於你的城市仍然提到你的國家。你需要首先解除。 – mabi

+0

@mabi好的,我不確定Hibernate是否會爲我做這件事。似乎沒有。謝謝! – mhmpl

相關問題