2012-11-21 54 views
0

在一個web應用程序中,我使用Hibernate的@SQLDelete註釋來「軟刪除」實體(即將狀態列設置爲表示其「已刪除」狀態的值,而不是實際從表中刪除它們)。是否可以使`@ SQLDelete`考慮`hibernate.default_schema`參數?

實體代碼如下所示:

@Entity 
@SQLDelete(sql="update pizza set status = 2 where id = ?") 
public class Pizza { ... } 

現在,我的問題是,Web應用程序不使用模式的所有者,以該表屬於連接到數據庫。例如。模式(在Oracle中)被稱爲pizza,Web應用程序用於連接的數據庫用戶是pizza_webapp。這是出於安全原因。 pizza_webapp用戶只有選擇/更新/刪除權限,它不能修改數據庫本身的結構。我在這裏沒有任何選擇,這是我無法改變的政策。

我指定的表實際上是與hibernate-default_schema參數處於休眠配置模式的名稱:

<property name="hibernate.default_schema">pizza</property> 

這對於通過映射實體去一切正常,Hibernate知道如何添加模式名稱在它生成的SQL中的表名之前。但不適用於原始SQL,並且@SQLDelete包含原始SQL。這是「按原樣」執行的,結果爲"table or view not found error"

到目前爲止,我們通過向pizza_webapp模式添加同義詞來解決此問題,指向pizza模式。它可以工作,但在添加實體時跨多個數據庫進行維護並不有趣。

那麼,是否有可能使@SQLDelete參考hibernate.default_schema參數?

(注:很顯然,我不想硬編碼在SQL架構名稱要麼...)

回答

0

我找不到任何的Hibernate解決這個問題。不過,我發現基於Oracle功能的解決方案。我在使用它之前做到這一點在我的會話:

//set the default schema at DB session level for raw SQL queries (see @SQLDelete) 
HibernateUtil.currentSession().doWork(new Work() { 
    @Override 
    public void execute(Connection connection) throws SQLException { 
     connection.createStatement().execute("ALTER SESSION SET CURRENT_SCHEMA="+HibernateUtil.getDefaultSchema()); 
    } 
}); 

我工作得很好,但不幸的是只在甲骨文(這是罰款,我們現在至少)。也許在其他RDBMS上有不同的方法來實現同樣的事情?

編輯:在我的HibernateUtil類的getDefaultSchema()方法這樣做是爲了得到Hibernate的配置默認模式:

defaultSchema = config.getProperty("hibernate.default_schema"); 

其中config是我org.hibernate.cfg.Configuration對象。