Spring Data JPA项目如何复用已有类避免实体类代码重复?
解决方案
方案1:继承公共Car类复用属性
直接让你的JPA实体类继承公共依赖库的Car类,所有字段、getter/setter直接复用,无需重复定义:
@Entity @Table(name = "customerCar") public class CarEntity extends Car { @Id @Override public Long getId() { return super.getId(); } // name、color等其余字段全部从父类Car继承,不需要重复编写 }
即使你无法修改公共库的Car类添加JPA注解也没关系,主流JPA实现(如Hibernate)支持直接继承普通POJO类,会自动识别父类的可持久化字段,仅需在子类中给主键字段添加@Id注解即可。
方案2:使用对象映射工具自动拷贝属性
如果业务场景不适合使用继承,可以用成熟的对象映射工具自动完成属性拷贝,完全避免手写setter:
- 高性能场景选MapStruct:MapStruct是编译期生成映射代码,没有反射开销,性能和手写代码一致。
引入依赖后定义映射接口即可:
使用时一行代码完成转换:@Mapper(componentModel = "spring") public interface CarMapper { CarMapper INSTANCE = Mappers.getMapper(CarMapper.class); CarEntity carToCarEntity(Car car); Car carEntityToCar(CarEntity entity); }
字段不同名也可以通过CarEntity customerCar = CarMapper.INSTANCE.carToCarEntity(car);@Mapping注解自定义映射规则,灵活度很高。 - 轻量场景用Spring自带工具:如果只是偶尔做转换,可以直接用Spring BeanUtils的拷贝方法:
该方法基于反射实现,无需额外引入依赖,适合调用量不大的场景。CarEntity customerCar = new CarEntity(); BeanUtils.copyProperties(car, customerCar);
方案3:用@Embedded注解嵌入公共类
你也可以将Car作为嵌入式属性放到实体类中,同样不需要重复定义字段:
@Entity @Table(name = "customerCar") public class CarEntity { @Id private Long id; @Embedded private Car car; // 可根据需求添加透传getter/setter,或者直接访问car属性 public String getName() { return car.getName(); } }
这种方式适合需要将公共类作为整体属性管理的场景。
内容的提问来源于stack exchange,提问作者Patrick Derckx
相关产品推荐
相关产品推荐

