我有一个名为 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);
}
}
有什么建议吗?
答案 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”所覆盖,因此不能在TimeBooking
和ActivityTimeBooking
之间创建关联
注2,为简洁起见,我使用了一个存储库(dao),在实际应用中,您可能希望将两个不同的存储库注入服务。