Spring Boot双向OneToMany关联下如何同时查询父对象与子对象
关联查询仅能获取子对象数据
我是Spring Boot新手,遇到一个问题:使用关联查询时仅能获取子对象数据。
子实体类 TenantUserConfiguration
@Entity @Table(name = "tenant_user_configuration") public class TenantUserConfiguration { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; @Column(name = "config_key") private String configKey; @Column(name = "config_value") private String configValue; private String system; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name="tenant_user_id",referencedColumnName = "tenant_user_id") @JsonBackReference private TenantUser tenantUser; }
父实体类 TenantUser
@Entity @Table(name = "tenant_user") public class TenantUser { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "tenant_user_id") private int tenantUserId; @OneToOne @JoinColumn(name = "tenant_id",referencedColumnName = "tenant_id") private Tenant tenant; @Column(name = "user_name") private String userName; @Column(name = "password") private String password; @Column(name = "enabled") private boolean enabled; @OneToMany(mappedBy = "tenantUser",fetch = FetchType.EAGER) @JsonManagedReference private Set<TenantUserConfiguration> tenantUserConfiguration = new HashSet<>(); }
解决方案
显式关联查询父实体:如果直接查询子对象
TenantUserConfiguration,默认只加载子对象本身。要同时获取父对象,需在JPQL中使用JOIN FETCH强制关联加载:SELECT tuc FROM TenantUserConfiguration tuc JOIN FETCH tuc.tenantUser这样执行查询时会一次性加载子对象和关联的父对象数据。
排查懒加载与会话问题:子实体的
@ManyToOne用了FetchType.LAZY,意味着只有调用tenantUser的getter方法时才会触发父对象查询。如果序列化(如返回JSON)时无法获取,可能是会话已关闭导致懒加载代理无法访问。可临时将FetchType.LAZY改为FetchType.EAGER测试,但注意这会增加数据库查询开销,生产环境需谨慎。调整JSON序列化注解:
@JsonBackReference可能会在父对象未加载时忽略该字段。可以改用@JsonIgnoreProperties避免循环引用,同时保证已加载的关联对象能被序列化:- 子实体
tenantUser字段添加:@JsonIgnoreProperties("tenantUserConfiguration") - 父实体
tenantUserConfiguration字段添加:@JsonIgnoreProperties("tenantUser")
- 子实体
验证数据库关联数据:确认
tenant_user_configuration表的tenant_user_id字段关联的是tenant_user表中存在的tenant_user_id值,若关联ID不存在,自然无法获取有效父对象。
内容的提问来源于stack exchange,提问作者Deep Shah
相关产品推荐
相关产品推荐

