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
相关产品推荐
相关产品推荐

