2011-07-07 186 views
2

我有一個包含另一個類的列表的Java類。Hibernate註釋級聯問題

@Entity public class Country { 


private Long id; 
private List<Hotel> hotels; 

public void setId(Long id) { 
this.id = id; 
} 

@Id 
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="COUNTRY_SEQ") 
@SequenceGenerator(name="COUNTRY_SEQ", sequenceName="COUNTRY_SEQ", allocationSize=1) 
public Long getId() { 
return id; 
} 

public void setHotels(List<Hotel> hotels) { 
this.hotels = hotels; 
} 

@OneToMany 
@JoinTable(
    name="COUNTRY_HOTELS", 
    [email protected](name="COUNTRY_ID"), 
    [email protected](name="HOTEL_ID") 
) 
public List<Hotel> getHotels() { 
return hotels; 
} 

} 

當我嘗試刪除一個國家,我得到「ORA-02292:完整性約束(HOT.fk1a1e72aaf2b226a)違反 - 子記錄發現」,因爲它不能刪除一個國家時,其子女(=酒店)仍然存在。

但是,它是這樣想的!我不想在刪除國家時刪除我的酒店。

我試過沒有 any @ Cascade-annotation但失敗了。我也嘗試過SAVE_UPDATE,但仍然失敗。 所以它@級聯註解,我需要(或有另一種解決方案?):

  • PERSIST
  • MERGE
  • REMOVE
  • REFRESH
  • DELETE
  • SAVE_UPDATE
  • REPLICATE
  • DELETE_ORPHAN
  • LOCK
  • EVICT

巴特

回答

0

你必須刪除全國前去除來自全國的酒店列表酒店,以告訴Hibernate的是,酒店沒有國家了。

+0

好吧,我知道你(和justYo)在說什麼,但這裏是另一個問題: 我們所有的行動都在被標記爲@Transactional方法來完成。 – sennzz

+0

我最後的意見是不完整的:這裏的全文: 我們所有的行動都在被標記爲@Transactional方法來完成,這意味着所有的報表(套酒店列表來nuull,保存,刪除),之後將被執行該方法已完成。所以,它仍然會拋出同樣的錯誤。 – sennzz

+0

嘗試檢查由Hibernate生成的SQL查詢,並查看連接表上的刪除是否出現在國家/地區表的刪除之前。不要將列表設置爲空,清除它,並且只有在刪除酒店後。如果仍然不起作用,請嘗試在呼叫清除之後和刪除呼叫之前清空會話。 –

0

不幸的是Hibernate不支持ON DELETE SET NULL型級聯的呢。 因此,您必須先手動刪除引用,然後才能刪除子實體。

有讓Hibernate一個future request來支持它。