SecondaryTable注解本地正常,测试环境查询FooBar2出现重复数据
问题排查:Hibernate SecondaryTable导致子类查询重复数据
环境信息
- Java 8:测试环境v202,本地版本230~301
- Spring Boot 1.5.4.RELEASE
- Hibernate 5.0.12
- JPA 2.1
实体类定义
@Entity @SecondaryTable(name = "FOO_BAR") @org.hibernate.annotations.Table(appliesTo = "foo_bar", optional = false) @DiscriminatorValue(MyEnum.Values.MY_DISCRIMINATOR) public class FooBar extends FooBarParent{ @Column(name = "COLUMN_NAME_OF_PRIMARY_TABLE_FOR_FIELD_A") private Long FIELD_A; @Column(table= "FOO_BAR", name = "COLUMN_NAME_OF_SECONDARY_TABLE_FOR_FIELD_B") private String FIELD_B; }
副表FOO_BAR建表脚本
CREATE TABLE FOO_BAR ( ID NUMBER PRIMARY KEY, TOTO VARCHAR2(10) ); ALTER TABLE FOO_BAR ADD CONSTRAINT FK_FOO_BAR_PARENT FOREIGN KEY (ID) REFERENCES FOO_BAR_PARENT(ID);
问题现象
原本继承体系运行正常,新增@SecondaryTable注解后:
- 本地环境(含同事本地、本地连接测试库)表现正常:新增FooBar时副表会插入数据,查询FooBarParent的另一个子类FooBar2不受影响
- 测试环境异常:查询FooBar2列表时出现重复数据,重复次数等于FOO_BAR表的行数,推测是Hibernate执行了不必要的左连接
已尝试无效方案
- 添加
@org.hibernate.annotations.Table注解 - 修改
@SecondaryTable的pkJoinColumns配置 - 调整主键外键结构
解决思路
- 锁定版本差异根源
- 对比测试环境与本地的JVM参数、Hibernate配置细节(如
hibernate.jdbc.batch_size、hibernate.default_batch_fetch_size等),重点检查影响关联查询的配置项 - 测试环境Hibernate 5.0.12存在继承+副表的兼容BUG,可尝试升级至同分支稳定版本(如5.0.15.Final)验证
- 对比测试环境与本地的JVM参数、Hibernate配置细节(如
- 修正副表注解配置
- 移除
@org.hibernate.annotations.Table(appliesTo = "foo_bar", optional = false),副表的非空性应通过@SecondaryTable(optional=false)控制,原配置可能导致Hibernate误解关联逻辑 - 显式指定
@SecondaryTable的主键关联,避免自动映射歧义:@SecondaryTable(name = "FOO_BAR", pkJoinColumns = @PrimaryKeyJoinColumn(name = "ID", referencedColumnName = "ID"))
- 移除
- 排查查询语句生成逻辑
- 在测试环境开启Hibernate SQL日志(
hibernate.show_sql=true、hibernate.format_sql=true),确认查询FooBar2时是否意外关联了FOO_BAR表 - 若存在不必要的左连接,可通过
@Where注解强制过滤:
或自定义JPQL查询,明确不关联FOO_BAR表@Where(clause = "DISCRIMINATOR_COLUMN = 'FOO_BAR_2'")
- 在测试环境开启Hibernate SQL日志(
- 验证继承策略兼容性
- 确认FooBarParent的继承策略(如单表继承
SINGLE_TABLE),Hibernate在该策略下处理副表可能存在版本特定BUG,可临时切换为JOINED策略验证
- 确认FooBarParent的继承策略(如单表继承
- 检查数据库层面差异
- 确认测试环境FOO_BAR表的外键
FK_FOO_BAR_PARENT是否正常生效,排查是否存在未关联到FOO_BAR_PARENT的脏数据
- 确认测试环境FOO_BAR表的外键
内容的提问来源于stack exchange,提问作者Daemonsoadfan
相关产品推荐
相关产品推荐

