Как использовать сопоставление ORM Spring Data JPA (Hibernate) с таблицами Oracle из другой схемы? - PullRequest
1 голос
/ 13 апреля 2020

oracle дБ - версия 12 c. Я использую разъем ojdbc8. Мне был предоставлен только доступ к аккаунту, назовем его схемой «USR». Авторизуйтесь с помощью USR, я вижу таблицы другой схемы, назовем ее схемой "ADM". Есть таблица "TGT_TABLE", которую я хочу сопоставить с JPA внутри схемы ADM. А под консолью 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, который не имеет учетной записи, связанной с доступом к схеме, и мой коллега уже предложил решение, использующее JDB C напрямую ... которого я действительно хочу избежать, пожалуйста, дайте мне знать, если есть правильная способ справиться с этим, спасибо

1 Ответ

2 голосов
/ 13 апреля 2020

Вы должны явно указать table_name и schema в аннотации @Table

Пример

 @Table(name="TGT_TABLE", schema="ADM")

См. Документацию в javax.persistence.Table

Пропуск схемы предполагает наличие скрытого владельца сеанса подключения, что приводит к ошибке.

Также нельзя передать определенное имя (ADM.TGT_TABLE). ) в качестве имени таблицы.

...