Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 服务无法在实体类中自动连线_Spring_Jpa - Fatal编程技术网

Spring 服务无法在实体类中自动连线

Spring 服务无法在实体类中自动连线,spring,jpa,Spring,Jpa,我需要一个RoleMappingService类(由@Service注释)对象进入Employee类(由@Entity注释) @Configurable @Component @Entity @NamedQuery(name = "Employee.findAll", query = "SELECT e FROM Employee e") public class Employee implements Serializable, UserDetails { @Autowired

我需要一个RoleMappingService类(由@Service注释)对象进入Employee类(由@Entity注释)

@Configurable
@Component
@Entity
@NamedQuery(name = "Employee.findAll", query = "SELECT e FROM Employee e")
public class Employee implements Serializable, UserDetails {

    @Autowired
    @Transient
    RoleMappingsService roleMappingsService;

    public static final String STATUS_ACTIVE = "ACTIVE";
    public static final String STATUS_INACTIVE = "INACTIVE";
    public static final String STATUS_LOCKED = "LOCKED";
    public static final String STATUS_ONLEAVE = "ONLEAVE";
    public static final String STATUS_EXPIRED = "EXPIRED";

    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "emp_id")
    private String empId;

    @Column(name = "emp_password")
    private String empPassword;

    @Column(name = "emp_email")
    private String empEmail;

    @Column(name = "emp_address")
    private String empAddress;

    @Column(name = "emp_age")
    private int empAge;

    @Column(name = "emp_firstname")
    private String empFirstname;
}
下面是我的课程

*********************角色映射服务类**********************

@Service
public class RoleMappingsService {
    @Autowired
    RolesMappingDao rolesMappingDao;


    public List<RolesMappings> getRolesMappingByauthSystemRole(String authSystemRole) {
        return rolesMappingDao.getRolesMappingByauthSystemRole(authSystemRole);
    }

}
此处Autowire不适用于roleMappingsService,并且对象始终为空。然而,我试图在其他一些服务中自动连接相同的对象,并且自动连接可以完美地工作


(我知道实体类仅用于表示数据库表,但在我的情况下,我需要设置一些依赖于另一个表的字段值,因此需要使用服务获取数据)

JB Nizet完全正确

我将在这里提供更多的解释

Spring只能自动关联bean、它管理的对象,而不能自动关联任意对象

实体通常是从JPA(Hibernate)中创建的,您不希望Spring管理这些实体

有一个相关的讨论,但底线是你不应该这样做

为什么不呢? 以下是几个问题/原因:

  • 也许这些实体将完全脱离spring上下文(序列化),那个引用应该包含什么?我们还应该序列化服务吗?怎么做

  • 如果转向服务的方法在spring驱动的应用程序(甚至可能在不同的JVM中)之外被调用,会发生什么

  • 如果该查询返回了1000个对象,那么您真的希望所有对象都驻留在应用程序上下文中吗?或者它们应该属于“原型”范围

正如您所看到的,它不能很好地处理spring概念。我认为这是因为Hibernate和JPA不“支持”实体内部的方法,它只是一个不同的框架。我知道还有其他框架允许这样的概念,但Hibernate/JPA就是不允许


因此,与尝试将服务注入实体bean不同,您可能应该重新设计应用程序,以便从外部调用服务方法(可能通过某个门面),实体将通过查询填充,然后使用附加信息“丰富”,如果我们谈论的是选择查询,或者,一些信息应该预先设置在实体对象上,由业务逻辑层生成,只有这样实体对象才应该存储在DB中,这是完全正确的

我将在这里提供更多的解释

Spring只能自动关联bean、它管理的对象,而不能自动关联任意对象

实体通常是从JPA(Hibernate)中创建的,您不希望Spring管理这些实体

有一个相关的讨论,但底线是你不应该这样做

为什么不呢? 以下是几个问题/原因:

  • 也许这些实体将完全脱离spring上下文(序列化),那个引用应该包含什么?我们还应该序列化服务吗?怎么做

  • 如果转向服务的方法在spring驱动的应用程序(甚至可能在不同的JVM中)之外被调用,会发生什么

  • 如果该查询返回了1000个对象,那么您真的希望所有对象都驻留在应用程序上下文中吗?或者它们应该属于“原型”范围

正如您所看到的,它不能很好地处理spring概念。我认为这是因为Hibernate和JPA不“支持”实体内部的方法,它只是一个不同的框架。我知道还有其他框架允许这样的概念,但Hibernate/JPA就是不允许


因此,与尝试将服务注入实体bean不同,您可能应该重新设计应用程序,以便从外部调用服务方法(可能通过某个门面),实体将通过查询填充,然后使用附加信息“丰富”,如果我们谈论的是选择查询,或者,一些信息应该预先设置在实体对象上,由业务逻辑层生成,只有这样实体对象才应该存储在DB中,您需要更改您的体系结构。实体不应该依赖于服务层。实体不是SpringBean,所以不能将任何SpringBean自动关联到实体中。用组件注释实体毫无意义。我曾尝试使用helper类获取RoleMappingService,在其中我编写了一个静态helper类,并通过该类尝试获取RoleMappingService对象,但仍然没有成功。同样,你不应该这样做。忘掉这个想法吧。使用来自服务的实体,而不是相反。您需要更改您的体系结构。实体不应该依赖于服务层。实体不是SpringBean,所以不能将任何SpringBean自动关联到实体中。用组件注释实体毫无意义。我曾尝试使用helper类获取RoleMappingService,在其中我编写了一个静态helper类,并通过该类尝试获取RoleMappingService对象,但仍然没有成功。同样,你不应该这样做。忘掉这个想法吧。使用服务中的实体,而不是相反。