如何在带有@Entity注释的类中使用@Autowired?

时间:2019-10-02 08:16:34

标签: spring jpa spring-data-jpa

我有一个名为 TimeBooking 的实体。当我请求此实体并返回到客户端时,我想从存储库中获取ActivityTimeBookings的列表。但是当函数被调用时,存储库为空。 因此,我尝试@Autowired存储库并将其标记为临时存储库,还说Spring应当注入一个依赖项。

@Configurable(preConstruction = true)
@Entity
public class TimeBooking extends BaseEntity{

    @Autowired
    private transient ActivityTimeBookingRepository activityTimeBookingRepository;

    ...

    @JsonProperty("activityTimeBookings")
    private List<ActivityTimeBooking> activityTimeBookings() {
        return this.activityTimeBookingRepository.findByDate(this.timeFrom);
    }
}

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

在带有@Autowired注释的类中使用@Entity是错误的。

解决方案如下:

1。创建服务界面:

public interface TimeBookingService {

   public List<ActivityTimeBooking> activityTimeBookings();

}  

2。创建服务接口的实现:

@Service
public class TimeBookingServiceImpl implements TimeBookingService {

    @Autowired
    private ActivityTimeBookingRepository activityTimeBookingRepository;

    public List<ActivityTimeBooking> activityTimeBookings() {
        return this.activityTimeBookingRepository.findByDate(this.timeFrom);
    }
}

答案 1 :(得分:0)

通常,向JPA实体中注入某些东西确实是一种错误的做法。 这些通常是由JPA实现(例如Hibernate)和spring创建的,因为DI框架实际上并不参与该过程。

请注意,由于查询的结果,可能创建了该类的许多实例,因此,如果您以后将其用于该对象列表的序列化,则给定N个这样的实体,最终可能会对数据库运行N个查询被找到。

回答有关“获得回购协议”的问题,我相信您应该考虑重构:

在服务类中(假设您有一个“常规”的contoller,service和dao):

您可以:

class MyService {
    SomeResult.. doSomething() {
     List<TimeBooking> allTimeBookings = dao.getAllTimeBooking();
     LocalDateTime timeFrom = calculateTimeFrom(allTimeBookings);
     List<ActivityTimeBooking> allActivityTimeBookings = dao.findByDate(timeFrom);
     return calculateResults(allTimeBookings, allActivityTimeBooking);        
    }
}

class MyDao {
  List<ActivityTimeBooking> findByDate(LocalDateTime timeFrom) {...}

  List<TimeBooking> getAllTimeBookings() {...}
}

关于服务的实现,我已经假定此用例不能被通常的“两个表之间的JOIN”所覆盖,因此不能在TimeBookingActivityTimeBooking之间创建关联

注2,为简洁起见,我使用了一个存储库(dao),在实际应用中,您可能希望将两个不同的存储库注入服务。