Oracle数据库的版本为12c。我使用ojdbc8连接器。我只被授予访问帐户的权限,我们称其为模式“ USR”。使用USR登录,我可以看到另一个架构的表,我们将其称为架构“ ADM”。我想在架构ADM中使用JPA将其映射为表“ TGT_TABLE”。在USR控制台下,我可以查询“ select * from ADM.TGT_TABLE”以获得正确的结果。现在,我将Entity类编写为:
@Data
@Entity
@Table(name = "ADM.TGT_TABLE") // or @Table(name = "TGT_TABLE") , Neither worked
public class ApiHeaderLogs {
@Id
@Column(name = "id")
String id;
....
和我的配置:
spring.jpa.hibernate.ddl-auto=none
# Oracle settings
spring.datasource.url=jdbc:oracle:thin:@10.119.125.70:1540:dhtlm4
spring.datasource.username=USR
spring.datasource.password=******
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
和我的测试:
Optional<ApiHeaderLogsEntity> ahl = apiHeaderLogsService.findById(id);
我有错误:
org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet
....
Caused by: java.sql.SQLSyntaxErrorException: ORA-00942: table or view does not exist
并且控制台中的SQL查询为:
select ... from adm_tgt_table where ... //@Table(name = "ADM.TGT_TABLE")
或
select ... from tgt_table where ... //@Table(name = "TGT_TABLE")
显然,它不解决表ADM.TGT_TABLE。如何映射到ADM.TGT_TABLE?我的经验主要是在MySQL上,它没有与模式访问相关的帐户,我的同事已经提出了直接使用JDBC的解决方案...我真的想避免,请告诉我是否有适当的方法来处理此问题,谢谢
您必须在table_name
批注中明确定义schema
和 @Table
示例
@Table(name="TGT_TABLE", schema="ADM")
请参阅javax.persistence.Table中的文档
省略模式会假定连接会话是默认所有者,这会导致错误。
您都不能将限定名(ADM.TGT_TABLE)作为表名传递。