java Spring Data JPA:如何使用只读用户名/模式访问另一个模式中的表

irlmq6kh  于 2023-05-05  发布在  Java
关注(0)|答案(1)|浏览(136)

因此,我在名为C##SCOTT的Oracle企业数据库中有一个名为Employee的数据库模式/用户。此架构/用户具有创建表、更新、读取和写入的所有权限。我还有另一个名为C##ORC_READ_ONLY的模式/用户,它被设置为对C##SCOTT模式中的表具有只读权限。如果我想通过C##ORC_READ_ONLY访问数据库,我的application.yml文件看起来像这样:

spring:
  datasource:
    url: jdbc:oracle:thin:@localhost:1521:orcl
    username: C##ORC_READ_ONLY
    password: --password goes here--
    driver-class-name: oracle.jdbc.OracleDriver

  jpa:
    database: oracle
    show-sql: true
    hibernate:
      ddl-auto: none

根据我的理解,我只是像这样编码我的实体:

@Data
@ToString
@Entity
@Table(name ="EMPLOYEE", schema="C##ORC_READONLY")
public class Employee {

    @Id                   
    @Column(name = "EMPNO")
    private Long id;

    private String ename;

    private String job;

    private Long mgr;

    private Date hiredate;

    private Long sal;

    private Long comm;

    private Long deptno;

}

。。。回购是这样的:

@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Long> {
}

我的演示Web服务的服务部分看起来像这样:

@Service
public class EmployeeService {

    @Autowired
    EmployeeRepository employeeRepository;

    @Autowired
    ObjectMapper employeeObjectMapper;

    public String getAllEmployeesService( ) throws JsonProcessingException {

        List<Employee> employeeArrayList = employeeRepository.findAll();
        GetAllEmployeesResponseWrapper getAllEmployeeResponseWrapper = new GetAllEmployeesResponseWrapper(employeeArrayList);
        String response = employeeObjectMapper.writeValueAsString(getAllEmployeeResponseWrapper);

        return response;

    }
}

一切编译正常,没有关于访问的警告或错误发生。但是,如果我尝试将请求消息发送到Web服务,我会抛出一个异常,说找不到表或视图:

ORA-00942: table or view does not exist

现在,如果我将用户名和密码更改为表的实际所有者的模式/用户名……很好用。我必须覆盖存储库中的findAll()方法才能使其工作吗?还是有什么不对劲的地方?

sulc1iza

sulc1iza1#

应该区分用户和架构。假设你说
我在Oracle企业数据库中有一个名为C##SCOTT的数据库模式/用户,名为Employee。
和/或
我还有另一个名为C##ORC_READ_ONLY的模式/用户,它被设置为对C##SCOTT模式中的表具有只读权限。
你的实体应该是

@Data
@ToString
@Entity
@Table(name ="EMPLOYEE", schema="C##SCOTT")
public class Employee {
}

代码的其余部分应该保持原样(微小的事情:你不需要@Repository通过接口扩展JpaRepository,因为Spring会自动解析它)。

相关问题