如何让Camel-JPA使用默认以外的数据库Schema?
我有一条包含命名查询的Camel路由:
.to("jpa://com.example.MyEntity?namedQuery=MyEntity.findAllRelevant")
对应的实体类指定了非默认的Schema:
@Entity @Table( name = "V_MY_ENTITY", schema = "DIFFERENT_SCHEMA" ) @Immutable @NamedQueries({@NamedQuery( name = "MyEntity.findAllRelevant", query = "select m from MyEntity m where m.relevant = 1" )}) public class MyEntity{ // 实体类内容 }
相关配置:
spring.jpa.properties.hibernate.default_schema=MY_SCHEMA
现在出现以下错误:
Caused by Error : 942, Position : 653, SQL = select ... from MY_SCHEMA.v_my_entity ..., Original SQL = select ... from MY_SCHEMA.v_my_entity ..., Error Message = ORA-00942: table or view does not exist
at oracle.jdbc.driver.T4CTTIoer11#processError[723]
尽管已经在实体类中指定了DIFFERENT_SCHEMA,但查询仍使用默认的MY_SCHEMA。请问如何让Camel-JPA使用默认以外的Schema?
以下几种方法可以解决这个问题:
在命名查询中显式指定Schema
修改实体类里的命名查询,直接在JPQL中指定目标Schema的物理表名:@NamedQueries({@NamedQuery( name = "MyEntity.findAllRelevant", query = "select m from DIFFERENT_SCHEMA.V_MY_ENTITY m where m.relevant = 1" )})这里要使用数据库实际的表名(比如示例中的大写
V_MY_ENTITY),直接指定物理表会绕过Hibernate的全局Schema解析逻辑。给实体单独配置Hibernate专属Schema注解
在实体类上添加Hibernate的@org.hibernate.annotations.Table注解,它的优先级高于全局default_schema配置,能强制指定该实体的Schema:@Entity @Table( name = "V_MY_ENTITY", schema = "DIFFERENT_SCHEMA" ) @org.hibernate.annotations.Table(appliesTo = "V_MY_ENTITY", schema = "DIFFERENT_SCHEMA") @Immutable @NamedQueries({@NamedQuery( name = "MyEntity.findAllRelevant", query = "select m from MyEntity m where m.relevant = 1" )}) public class MyEntity{ // 实体类内容 }在Camel-JPA端点直接指定Schema参数
在Camel的JPA端点URL中添加schema参数,强制当前端点使用指定Schema,不会受全局配置影响:.to("jpa://com.example.MyEntity?namedQuery=MyEntity.findAllRelevant&schema=DIFFERENT_SCHEMA")检查配置优先级与版本兼容性
如果实体类的@Table(schema)不生效,先排查是否有其他配置源覆盖了全局Schema设置;另外部分旧版本Hibernate存在default_schema优先级过高的问题,可以尝试升级到较新的Hibernate版本。
内容的提问来源于stack exchange,提问作者inetphantom

