如何结合懒加载与@JoinColumnOrFormula仅获取关联实体ID?
如何在Hibernate的@ManyToOne关联中仅获取关联实体的ID?
你当前的实体A与B通过@ManyToOne关联,Hibernate默认会加载整个B实体,以下两种方法可以实现仅获取B的ID:
方法一:利用懒加载代理获取ID
将@ManyToOne的fetch属性设置为FetchType.LAZY,Hibernate会为B创建懒加载代理对象。调用代理的getId()方法时,Hibernate不会加载整个B实体,直接从代理中获取ID(注意要在持久化上下文/事务范围内操作,避免懒加载异常)。
修改后的实体代码:
@Entity class A { @ManyToOne(fetch = FetchType.LAZY) @JoinColumnOrFormula(formula = @JoinFormula(value = "'SOME_VALUE'", referencedColumnName = "type")) @JoinColumnOrFormula(column = @JoinColumn(name = "name::varchar", referencedColumnName = "code", nullable = false)) private B name; // 提供获取B的ID的方法 public Long getBId() { return name != null ? name.getId() : null; } }
方法二:直接映射B的ID字段
如果只需要B的ID,不需要操作B实体的其他属性,可以直接在A中映射B的ID字段,无需关联整个B实体。通过@Formula编写查询语句直接获取ID:
@Entity class A { // 直接映射B的ID @Formula("(SELECT b.id FROM B b WHERE b.type = 'SOME_VALUE' AND b.code = name::varchar)") private Long bId; // 若偶尔需要使用B实体,可保留关联并设为懒加载 @ManyToOne(fetch = FetchType.LAZY, optional = false) @JoinColumnOrFormula(formula = @JoinFormula(value = "'SOME_VALUE'", referencedColumnName = "type")) @JoinColumnOrFormula(column = @JoinColumn(name = "name::varchar", referencedColumnName = "code")) private B name; }
两种方法的适用场景:
- 方法一适合需要偶尔访问B实体其他属性的场景,兼顾ID获取和实体操作;
- 方法二适合仅需B的ID的场景,性能更优,避免不必要的实体加载。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

