JPA @OneToOne关联数据库视图报错'referenced relation is not a table'求助
问题根因
报错核心是PostgreSQL不支持将视图作为外键约束的关联对象,Hibernate默认执行DDL自动更新时,会为
@OneToOne关联尝试创建指向视图vclientesgds的外键,因此触发referenced relation "vclientesgds" is not a table错误。
可行解决方案
方案1:禁用该关联的外键约束生成(优先推荐)
直接在@JoinColumn注解中指定不创建外键,适配你当前的Hibernate 5.2版本:
该配置不会影响关联查询的正常使用,只是跳过外键约束的创建步骤。@OneToOne(fetch = FetchType.LAZY, orphanRemoval = false) @JoinColumn( name = "c_id", nullable = false, foreignKey = @ForeignKey(value = ConstraintMode.NO_CONSTRAINT) ) private vclientesgds c_id;方案2:修正视图实体的冗余配置
视图是只读对象,不需要主键生成策略,删除vclientesgds类上的@GeneratedValue注解即可:@Entity @Immutable public class vclientesgds implements Serializable { private static final long serialVersionUID = 1L; @Id @Column(name = "c_id", updatable = false, nullable = false) private Long c_id; // 其余属性保持不变 }方案3:关闭Hibernate自动DDL生成
生产环境通常不会依赖Hibernate自动修改表结构,直接在配置文件中关闭自动DDL即可彻底规避该类报错:
原生Hibernate配置(hibernate.cfg.xml):
Spring Boot项目配置(application.properties):<property name="hibernate.hbm2ddl.auto">none</property>spring.jpa.hibernate.ddl-auto=none方案4:修正@SubSelect注解的使用(如果你需要保留该注解)
用@SubSelect映射视图时不需要配置@Table,同时可以添加@Synchronize保证关联查询数据一致性:@Immutable @SubSelect("select c_id, store_id, cnpj, company_name from napp_front.vclientesgds") @Synchronize({"vclientesgds"}) public class vclientesgds implements Serializable { private static final long serialVersionUID = 1L; @Id @Column(name = "c_id", updatable = false, nullable = false) private Long c_id; // 其余属性保持不变 }
验证说明
以上方案任选(优先方案1+方案2组合),重启项目后Hibernate不会再尝试创建指向视图的外键,@OneToOne关联的查询、懒加载功能均可正常运行。
内容的提问来源于stack exchange,提问作者Marcos Paulo
相关产品推荐
相关产品推荐

