【问题标题】:Spring Boot Model Class only accessing Oracle table when using SynonymSpring Boot Model Class 仅在使用 Synonym 时访问 Oracle 表
【发布时间】:2021-10-31 03:53:18
【问题描述】:

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

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

在 SQL Developer 中:

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”错误?

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

但我不喜欢使用同义词,因为它的名称与实际的表名不同,这会给应用程序维护带来混乱和困难。

谢谢。

【问题讨论】:

    标签: java spring oracle spring-boot spring-data


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 很好的答案。很好解释。我使用了 @Table(name="MYTABLE", schema="MYUSER") 并且效果很好。非常感谢!
    猜你喜欢
    • 2021-12-14
    • 2018-03-29
    • 2017-02-22
    • 2020-02-16
    • 1970-01-01
    • 2015-08-22
    • 1970-01-01
    • 2012-11-19
    • 2020-12-26
    相关资源
    最近更新 更多