我需要将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类仅用于表示数据库表,但是在我的情况下,我需要设置一些依赖于另一个表的字段值,因此需要使用服务来获取数据)
答案 0 :(得分:3)
JB Nizet完全正确
我将在此处尝试提供更多说明。
Spring只能自动装配Bean,它管理的对象,而不是任意对象。
实体通常是从JPA(休眠)内部创建的,不是您希望由Spring管理的实体。
有相关的讨论available here,但最重要的是,您永远不要做这样的事情。
为什么不呢? 这是几个问题/原因:
也许这些实体将完全超出spring上下文(序列化),该引用应包含哪些内容?我们还应该序列化服务吗?怎么样?
如果将转向服务的方法称为在Spring驱动的应用程序之外(甚至在不同的JVM中),会发生什么?
如果该查询返回了1000个对象,您是否真的希望所有这些对象都驻留在应用程序上下文中?还是应该属于“原型”范围?
如您所见,它不适用于弹簧概念。我认为其原因是Hibernate和JPA不“支持”实体内部方法的想法,它只是一个不同的框架。我知道还有其他框架可以支持这种概念,但是Hibernate / JPA不允许,
因此,与其尝试将服务注入到实体Bean中,不如应该重新设计应用程序,以便可以从外部(也许是通过某些外观)调用服务方法,而实体将仅由查询填充,然后“如果我们正在谈论SELECT查询,则使用“附加信息”,或者另外,应在由业务逻辑层生成的实体对象上预先设置一些信息,然后才应将实体对象存储在数据库中