服务无法在实体类中自动关联

时间:2018-07-22 18:55:50

标签: spring jpa

我需要将RoleMappingService类(由@Service注释)对象放入Employee类(由@Entity注释)

下面是我的课程

********************* RoleMappingsService类**********************

@Service
public class RoleMappingsService {
    @Autowired
    RolesMappingDao rolesMappingDao;


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

}
################员工类别
@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;
}

此处Autowire不适用于roleMappingsService,并且始终发现该对象为null。但是,我尝试在其他服务中自动对同一对象进行接线,而Autowire可以正常工作。

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

1 个答案:

答案 0 :(得分:3)

JB Nizet完全正确

我将在此处尝试提供更多说明。

Spring只能自动装配Bean,它管理的对象,而不是任意对象。

实体通常是从JPA(休眠)内部创建的,不是您希望由Spring管理的实体。

有相关的讨论available here,但最重要的是,您永远不要做这样的事情。

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

  • 也许这些实体将完全超出spring上下文(序列化),该引用应包含哪些内容?我们还应该序列化服务吗?怎么样?

  • 如果将转向服务的方法称为在Spring驱动的应用程序之外(甚至在不同的JVM中),会发生什么?

  • 如果该查询返回了1000个对象,您是否真的希望所有这些对象都驻留在应用程序上下文中?还是应该属于“原型”范围?

如您所见,它不适用于弹簧概念。我认为其原因是Hibernate和JPA不“支持”实体内部方法的想法,它只是一个不同的框架。我知道还有其他框架可以支持这种概念,但是Hibernate / JPA不允许,

因此,与其尝试将服务注入到实体Bean中,不如应该重新设计应用程序,以便可以从外部(也许是通过某些外观)调用服务方法,而实体将仅由查询填充,然后“如果我们正在谈论SELECT查询,则使用“附加信息”,或者另外,应在由业务逻辑层生成的实体对象上预先设置一些信息,然后才应将实体对象存储在数据库中