You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot多对一映射嵌套POJO字段赋值(不使用new关键字)

不用new给多对一映射字段赋值的方案

1. 用JPA的EntityManager.getReference()

这是最适配多对一场景的办法,JPA会返回一个懒加载代理对象——说白了就是个占位的空壳,不会立刻去查数据库,只要传实体类和对应的ID就能创建关联,完全不用自己写new。

示例代码:

@Autowired
private EntityManager entityManager;

// 给Model_1的dTrade字段赋值
Model_1 model1 = new Model_1(); // 要是连Model_1也不想new,后面还有其他方案
Trade tradeProxy = entityManager.getReference(Trade.class, tradeId);
model1.setDTrade(tradeProxy);

只要你的Trade在数据库里存在,这个代理对象后面用到其他字段时才会真正去查库,完全满足多对一关联的需求。

2. 用Spring Data JPA的getById()

Spring Data JPA把上面的方法做了封装,用起来更简洁:

@Autowired
private TradeRepository tradeRepository;

Model_1 model1 = new Model_1();
Trade tradeProxy = tradeRepository.getById(tradeId);
model1.setDTrade(tradeProxy);

这个方法返回的同样是代理对象,和上面的效果一致,不会触发立即查询。

3. 从Spring容器拿实例(如果Trade是Spring管理的Bean)

要是你的Trade类加了@Component这类Spring Bean注解,可以直接从容器里获取现成实例:

@Autowired
private Trade trade;

Model_1 model1 = new Model_1();
trade.setId(tradeId);
model1.setDTrade(trade);

不过这种方式适合可复用的单例场景,如果每次需要不同ID的实例,得给Trade加上@Scope("prototype"),让Spring每次返回新实例,避免线程安全问题。

4. 用对象映射工具(比如MapStruct)

如果是从DTO或者其他对象转换过来,用MapStruct这类工具就不用手动写new了:
先定义一个Mapper接口:

@Mapper(componentModel = "spring")
public interface Model1Mapper {
    Model1Mapper INSTANCE = Mappers.getMapper(Model1Mapper.class);

    @Mapping(source = "tradeId", target = "dTrade.id")
    Model_1 toModel1(Model1Dto dto);
}

使用时直接调用映射方法:

Model1Dto dto = new Model1Dto();
dto.setTradeId(tradeId);
Model_1 model1 = Model1Mapper.INSTANCE.toModel1(dto);

MapStruct会自动帮你创建Trade实例并完成赋值,你完全不用管new的事。

5. 用Lombok的Builder模式

给Trade类加上@Builder注解,通过Builder模式创建实例,你自己不用写new:

@Data
@Builder
public class Trade {
    private Long id;
}

创建实例时的写法:

Model_1 model1 = new Model_1();
Trade trade = Trade.builder().id(tradeId).build();
model1.setDTrade(trade);

虽然底层还是会生成new的代码,但你自己不用手动编写,也算满足需求。


内容的提问来源于stack exchange,提问作者user13876589

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 23:55:18