我有一个spring启动应用程序,需要创建一个访问数据库表的模型类。
由于数据库中的权限配置,SELECT操作只能在表名前加上用户名或使用Oracle同义词。
In 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的公共同义词。
所以上面最后两个select访问的是同一个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 {
....
}
我的问题是为什么@Table(name = "MYUSER.MYTABLE")正在生成"ORA-00942"SELECT * FROM MYUSER出错。MYTABLE工作良好的SQL开发人员?
在应用程序中,它工作的唯一方法是使用公共同义词。
但是我不喜欢使用Synonym,因为它的名称与实际的表名称不同,会给应用程序维护带来混淆和困难。
谢谢。
注释@Table(name = "MYTABLE")
不起作用,因为您用来访问数据库的用户可以访问另一个模式作为默认模式。
注释@Table(name = "MYUSER.MYTABLE")
不起作用,因为这不是访问不同模式中的表的正确语法。您需要使用注释@Table(name="MYTABLE", schema="MYUSER")
,该注释明确表示使用模式MYUSER并在该模式中搜索名为MYTABLE的表。在注释Table的javadoc中解释了这种语法:
(可选)表的模式.默认为user的默认模式。
最后一个注释@Table(name = "MYTABLE_SYNONYM")
,因为有人定义了一个同义词MYTABLE_SYNONYM来访问模式MYUSER上的表MYTABLE。从访问数据库的用户的角度来看,这是透明的。