【问题标题】:Inject service to entity object向实体对象注入服务
【发布时间】:2025-12-18 09:45:01
【问题描述】:

我想在持久化或更新之前为实体列设置一个值。为此,我想注入一个服务。

@Entity
@Configurable(autowire=Autowire.BY_TYPE)
@Table(name="WARD")
public class Ward {

@Column(name = "HOSPITAL_ID")
private Long hospitalId;

@Transient
@Autowired
private HospitalService hospitalService;

public Long getHospitalId() {
    return hospitalId;
}

public void setHospitalId(Long hospitalId) {
    this.hospitalId = hospitalId;
}

@PreUpdate
@PrePersist
private void preUpdatePersist(){
    if(hospitalId == null && hospitalService != null)
        hospitalId = hospitalService.getSelectedHospital().getId();
}}

这是我在互联网上找到的方式。但这不会注入new Ward() 创建。如何向实体注入服务。

这是春季版本 4.3.10,休眠 4.2.7

【问题讨论】:

    标签: spring hibernate dependency-injection autowired


    【解决方案1】:

    您不能在实体中注入服务,因为该实体不是 Spring 托管 bean。

    您可以创建一个包含 ApplicationContext 的辅助类:

    @Component
    public class ApplicationContextProvider implements ApplicationContextAware {
    
        private static ApplicationContext context;
    
        public static <T> T bean(Class<T> beanType) {
            return context.getBean(beanType);
        }
    
        public static Object bean(String name) {
            return context.getBean(name);
        }
    
        @Override
        public void setApplicationContext(@SuppressWarnings("NullableProblems") ApplicationContext ac) {
            context = ac;
        }
    }
    

    现在您可以使用它来访问实体中的服务:

    @PreUpdate
    @PrePersist
    private void preUpdatePersist(){
        if(hospitalId == null && hospitalService != null)
            ApplicationContextProvider.bean(HospitalService.class);
            hospitalId = hospitalService.getSelectedHospital().getId();
        }
    }
    

    【讨论】:

    • 我没想到@PreUpdate@PrePersist。很高兴知道