2011-10-12 74 views
0

我正在研究spring hibernate應用程序,並嘗試使用非id多對一關係的列從表中刪除。 實體類是:休眠HQL刪除查詢使單列失效

@Entity 
public class Day { 
@id(name = "DAY_ID") 
dayId; 
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
@JoinColumn(name = "DAY_ID") 
List<Holiday> holidayList; 
... 
} 

@Entity 
public class Holiday { 
@id(name="HOLIDAY_ID") 
holidayId; 
@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "DAY_ID") 
Day day; 
... 
} 

我想刪除使用HQL從假期表中的一行。

String query = "DELETE FROM Holiday WHERE day.dayId = " + dayObject.getdayId(); 
Query holidayDeleteQuery = getSession().createQuery(query); 
holidayDeleteQuery.executeUpdate(); 

在控制檯中我得到適當的刪除查詢,但在檢查數據庫發現,該行仍然存在,只是現在在假期表的DAY_ID欄爲空。我無法弄清楚爲什麼會發生這種情況?
編輯:幫助!我的主要問題是爲什麼DAY_ID列更改爲空值?

+0

當你說你正在得到一個正確的刪除查詢,你可以發佈SQL?我真誠地懷疑你得到的刪除查詢是正確的,因爲這意味着你的數據庫沒有正確地進行簡單的刪除。 – Thor84no

+0

嗨生成查詢是Hibernate:從HOLIDAYS刪除其中DAY_ID = 1 – parbi

+0

這就是當你有show_sql = true時Hibernate打印出來的日誌,或者你只是假設如果字符串查詢是好的? – Thor84no

回答

0

我不知道這是你的問題,但在你的查詢,你說「DELETE FROM 假期 ...」,但你的類名是假日。在HQL中,你應該使用類名而不是表名或其他。這是你的代碼中的錯字或只是在這裏?

實際上,在進一步觀察之後還有一些問題。這是我會寫:

String query = "DELETE FROM Holiday h WHERE h.day = :day"; 
Query holidayDeleteQuery = getSession().createQuery(query); 
query.setParameter("day", dayObject); 
holidayDeleteQuery.executeUpdate(); 

要打破它 - 用類名「假日」,分配給它的別名「H」則引用假日對象的天域(「h.day 「)並將其與您擁有的實際Day對象進行比較。

+0

雅我使用的是classname。它是一個錯字。 – parbi

+0

你嘗試了其餘的嗎? – Thor84no

+0

嘗試傳遞該對象,仍然得到相同的結果,只有day_id更改爲null。我想知道是因爲春天發生了嗎? – parbi

0

你的ONDELETE外鍵約束是什麼?可能你的應用程序的其他部分插入了一行?