2015-10-06 21 views
1

我有,當我試圖映射實體以下錯誤:ORA-00942:表或視圖不存在 - 與非大寫字母休眠

ORA-00942:表或視圖不存在

我發現問題在於,hibernate試圖以「非大寫」(小寫)字母查找表名,但Oracle擁有大寫字母的表名(儘管表是用非大寫字母)。 我可以解決這個問題,如果我添加註釋@Table@Column把名稱放在大寫字母,但我不想添加這些註釋。

我想知道是否有任何不同的方式來做到這一點。

SQL:

create table foo(
    id    integer not null 
); 

alter table foo 
    add constraint foo_pk 
    primary key (id); 

實體工作:

@Entity 
public class Foo { 

    @Id 
    private Long id; 

//getter and setter 
} 

實體工作:

@Entity 
@Table(name = "FOO") 
public class Foo { 

    @Id 
    private Long id; 

    //getter and setter 
} 

謝謝!

+0

Oracle中的表名和列名不區分大小寫,所以應該會導致問題。你能發佈與問題相關的代碼嗎?但是,在訪問表元數據的數據字典視圖時可能會遇到問題,因爲表/列名的確存儲爲大寫。 –

+0

只有當未引用對象名時才區分大小寫: OBJECT_NAME = object_name = Object_Name <>「Object Name」。 ORM使用共同的引用符號。 – Husqvik

+0

我添加了代碼作爲例子。 – Roman

回答

1

您可以定義一個自定義NamingStrategy,使特定的表和列名從您的實體轉換到數據庫。這裏是一些example如何做到這一點。因此,您只需創建NamingStrategy接口的實現或擴展一些現有策略,使用您想要獲得的行爲修改它的行爲,然後通過休眠XML配置參數hibernate.ejb.naming_strategy或通過Configuration類註冊這個新策略。

+0

謝謝!是否已經創建了NamingStrategy實現來執行我想要執行的操作? – Roman

+0

目前不能說,你可以嘗試這4種現有的策略作爲簡單的java類,並簡單地檢查他們如何翻譯名稱。如果沒有人通過,只需重寫一個用於類名和列名解析的方法即可 – Stanislav