2012-09-20 154 views
0

我想知道這種情況的正確解決方案是什麼。該方法正在事務中運行。我刪除了這個方法的第一行,我將得到分離的實體傳遞給持久化異常。我理解這個問題。該公司不在持久性背景下。 下面的代碼是唯一的解決方案嗎?這是更好的方式嗎?持久性上下文休眠

@Override 
public void delete(Company company) { 
    company = companyDao.get(company.getId(), CompanyLoadParameter.LOAD_LANGUAGES); 
    companyDao.delete(company); 
} 
+1

要理解這個問題,您希望從數據庫中刪除特定的公司實體,但不希望先執行SELECT? –

+0

是的。如果沒有首先從DB.company = companyDao.get(company.getId(),CompanyLoadParameter.LOAD_LANGUAGES)獲取對象,可以這樣做嗎? – pethel

回答

0
Session#createQuery("DELETE FROM " + Company.class.getName() + 
    " WHERE " + Company.K_id "=?") 
    .addParameter(0, CompanyLoadParameter.LOAD_LANGUAGES) 
    .executeUpdate(); 

哪裏Company.K_id是主鍵的Java屬性名稱(字符串)。

public static final String K_id = "id"; 

我這樣做,因爲HQL可以使用標準的IDE工具重構,並且可能在之後繼續工作。在HQL https://docs.jboss.org/hibernate/orm/3.5/reference/en/html/queryhql.html

URL

+0

好吧,HQL就是答案。謝謝 – pethel

0

是,這是正確的方式刪除單個實體和我的信息,有沒有更好的辦法。

如果您在預先抓取時遇到問題,那麼您應該重新考慮您的JPA實體配置。


還有另一種方法是使用HQL DELETE查詢,但這次有一個issue。刪除操作不會級聯到關聯的集合。這是危險和醜陋的。

JPA 2.1他們提到批量DELETE查詢,但他們沒有提及使用DELETE查詢刪除單個實體的任何事情,我認爲必須有一個原因。