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

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

我有一个实体叫做TimeBooking。当我请求此实体并返回到客户端时,我希望从存储库中获取ActivityTimeBookings列表。但是当调用函数get时,repo为null。 所以我试图@Autowired回购协议,并将其标记为transient,还说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);
    }
}
有什么建议吗?

在用@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() {...}
}