Spring 如何在用@Entity注释的类中使用@Autowired?
我有一个实体叫做TimeBooking。当我请求此实体并返回到客户端时,我希望从存储库中获取ActivityTimeBookings列表。但是当调用函数get时,repo为null。 所以我试图@Autowired回购协议,并将其标记为transient,还说Spring存在一个应该注入的依赖项Spring 如何在用@Entity注释的类中使用@Autowired?,spring,jpa,spring-data-jpa,Spring,Jpa,Spring Data Jpa,我有一个实体叫做TimeBooking。当我请求此实体并返回到客户端时,我希望从存储库中获取ActivityTimeBookings列表。但是当调用函数get时,repo为null。 所以我试图@Autowired回购协议,并将其标记为transient,还说Spring存在一个应该注入的依赖项 @Configurable(preConstruction = true) @Entity public class TimeBooking extends BaseEntity{ @Auto
@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);
}
}
有什么建议吗?在用@Entity注释的类中使用@Autowired是一种糟糕的做法
解决方案如下:
一,。创建服务接口:
二,。创建服务接口的实现:
在用@Entity注释的类中使用@Autowired是一种糟糕的做法
解决方案如下:
一,。创建服务接口:
二,。创建服务接口的实现:
通常,向JPA实体中注入某些东西确实是一种糟糕的做法。 这些通常是由JPA实现(如Hibernate和spring)创建的,因为DI框架并不真正参与这个过程 请注意,由于查询的结果,可能会创建此类的许多实例,因此,如果以后将其用于此对象列表的序列化,则如果检索到N个类似的实体,则可能最终会对数据库运行N个查询 <> P>回答你关于获得回购的问题,我认为你应该考虑重构: 在服务类中,假设您有一个常规控制器、服务和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() {...}
}
关于服务实现,我假设这个用例不能被两个表之间的常规连接所覆盖,因此在TimeBooking和ActivityTimeBooking之间创建关联不是一个选项
注意2,为了简洁起见,我使用了一个存储库dao,在实际应用程序中,您可能希望向服务中注入两个不同的存储库。通常将某些内容注入JPA实体是一种不好的做法。 这些通常是由JPA实现(如Hibernate和spring)创建的,因为DI框架并不真正参与这个过程 请注意,由于查询的结果,可能会创建此类的许多实例,因此,如果以后将其用于此对象列表的序列化,则如果检索到N个类似的实体,则可能最终会对数据库运行N个查询 <> P>回答你关于获得回购的问题,我认为你应该考虑重构: 在服务类中,假设您有一个常规控制器、服务和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() {...}
}
关于服务实现,我假设这个用例不能被两个表之间的常规连接所覆盖,因此在TimeBooking和ActivityTimeBooking之间创建关联不是一个选项
注意2,为了简洁起见,我使用了一个存储库dao,在实际应用程序中,您可能希望向服务中注入两个不同的存储库。不要将内容自动关联到实体中。这只是一个糟糕的设计,尤其是在你显示的代码中。在我的情况下,还有其他关于访问repo的建议吗?尝试访问存储库是错误的。这应该是在服务层上,当您构建结果对象时。好的,我会试试。感谢您的努力。不要将内容自动关联到实体中。这只是一个糟糕的设计,尤其是在你显示的代码中。在我的情况下,还有其他关于访问repo的建议吗?尝试访问存储库是错误的。这应该是在服务层上,当您构建结果对象时。好的,我会试试。谢谢你的努力。
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() {...}
}