首页 > 解决方案 > Spring Boot Model Class 仅在使用 Synonym 时访问 Oracle 表

问题描述

我有一个 Spring Boot 应用程序,需要创建一个访问数据库表的模型类。

由于数据库中的权限配置,SELECT 只能使用表名前面的用户名或使用 Oracle 同义词。

在 SQL 开发人员中:

SELECT * FROM MYTABLE; // This doesn't work - ORA-00942: table or view does not exist
SELECT * FROM MYUSER.MYTABLE;  // This works
SELECT * FROM MYTABLE_SYNONYM; // This works

在 Oracle 中,MYTABLE_SYNONYM 是 MYTABLE 的公共同义词。

所以上面的最后两个 SELECTS 正在访问同一个 MYTABLE 表。

在应用程序中:

@Entity
//@Table(name = "MYTABLE") // This doesn't work - ORA-00942: table or view does not exist
//@Table(name = "MYUSER.MYTABLE") // This DOESN'T work - ORA-00942: table or view does not exist
@Table(name = "MYTABLE_SYNONYM") // This works
public class MyClass implements Serializable {
....
}

我的问题是,如果 SELECT * FROM MYUSER.MYTABLE 在 SQL Developer 中工作正常,为什么 @Table(name = "MYUSER.MYTABLE") 会生成“ORA-00942”错误?

在应用程序中,唯一的工作方式是使用公共同义词。

但我不喜欢使用同义词,因为它可能会导致应用程序维护混乱和困难,因为名称与实际表名不同。

谢谢。

标签: javaspringoraclespring-bootspring-data

解决方案


注释@Table(name = "MYTABLE")不起作用,因为您用来访问数据库的用户可以访问另一个架构作为默认架构。

注释@Table(name = "MYUSER.MYTABLE")不起作用,因为这不是访问不同模式中的表的正确语法。您需要使用 @Table(name="MYTABLE", schema="MYUSER")明确表示使用模式 MYUSER 的注释并在该模式中搜索名为 MYTABLE 的表。此语法在注释Table的 javadoc 中进行了解释:

(可选)表的架构。默认为用户的默认架构。

最后一个注释@Table(name = "MYTABLE_SYNONYM")是因为有人定义了同义词 MYTABLE_SYNONYM 来访问模式 MYUSER 上的表 MYTABLE。从访问数据库的用户的角度来看,这是透明的。


推荐阅读