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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 07:45:04