Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.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
Java JPA&x2B;Spring-并行类层次结构_Java_Spring_Generics_Jpa_Spring 4 - Fatal编程技术网

Java JPA&x2B;Spring-并行类层次结构

Java JPA&x2B;Spring-并行类层次结构,java,spring,generics,jpa,spring-4,Java,Spring,Generics,Jpa,Spring 4,据我所知,在JPA实体上实现并行类层次结构的唯一方法如下: @Entity public abstract class Job<A extends Account> { @Any(metaColumn = @Column) @AnyMetaDef( idType = "integer", metaType = "string", metaValues = { @MetaValue(value = "Ac

据我所知,在JPA实体上实现并行类层次结构的唯一方法如下:

@Entity
public abstract class Job<A extends Account> {

  @Any(metaColumn = @Column)
  @AnyMetaDef(
        idType = "integer",
        metaType = "string",
        metaValues = {
            @MetaValue(value = "AccountX", targetEntity = AccountX.class),
            @MetaValue(value = "AccountY", targetEntity = AccountY.class)
  })
  @ManyToOne @JoinColumn 
  private A account;

  public A getAccount() { return account; }
  public void setAccount(A account) { this.account = account; }
}

@Entity
public class JobX extends Job<AccountX> {}

@Entity
public class JobY extends Job<AccountY> {}
这确实有效。JobX类型的对象仅与AccountX类型的对象关联。 这种设计背后的理念是,最终能够根据类型呈现两种行为。 现在的问题是Spring无法自动连接提供了两种实现的特定bean。让我们更具体地说:

@Component
public class AccountService<A extends Account> {
    public A getAccount() { // gets the account }
}

public interface JobService<A extends Account, J extends Job<A>> {
    J saveJob(J job);
}

@Component
public class JobServiceX implements JobService<AccountX, JobX>  {

    @Autowired private AccountService<AccountX> accountService;

    @Override
    public JobX saveJob(JobX job) { // save implementation for JobX }
}

@Component
public class JobServiceY implements JobService<AccountY, JobY>  {

    @Autowired private AccountService<AccountY> accountService;

    @Override
    public JobY saveJob(JobY job) { // save implementation for JobY }
}
@组件
公营会计服务{
public A getAccount(){//获取帐户}
}
公共接口作业服务{
J保存作业(J作业);
}
@组成部分
公共类JobServiceX实现JobService{
@自动连线私人帐户服务;
@凌驾
public JobX saveJob(JobX job){//save implementation for JobX}
}
@组成部分
公共类JobServiceY实现JobService{
@自动连线私人帐户服务;
@凌驾
public JobY saveJob(JobY job){//save implementation for JobY}
}
现在,如果我尝试使用泛型实现特定类型的bean来定义行为:

@Component
public class JobHandler<A extends Account, J extends Job<A>> {
    @Autowired private JobService<A,J> jobService;
}
@组件
公共类作业处理程序{
@自动连线私人作业服务;
}
我收到以下错误:
无法自动关联字段:private JobService JobHandler.JobService;嵌套异常为org.springframework.beans.factory.NoniqueBeandDefinitionException:未定义[JobService]类型的符合条件的bean:应为单个匹配bean,但找到2:jobXService,jobYService

因此,我有两个问题:

  • 有解决办法吗?我知道Spring4处理泛型bean,这与使用
    @Component
    注释
    JobService
    相同,这显然是错误的,因为它是一个接口,而不是一个实现
  • 不管上面第1点是什么,这已经开始创造一个“泛型地狱”,因为现在我需要开始让我所有的SpringBean都成为泛型。有没有更好的设计或更好的方法来做到这一点?有没有办法而不是使作业通用化,而是提供一个可以在子实体中覆盖的getter/setter

  • 提前谢谢大家

    您确定这是按照您认为的方式工作的(在实体级别)?我从未见过任何文档表明支持这种构造。@alan hay对不起,我想说得不那么详细。我正在从Hibernate使用
    @Any
    @AnyMetaDef
    ,如图所示。这似乎奏效了。我用正确的注释编辑了我的问题。
    @Component
    public class JobHandler<A extends Account, J extends Job<A>> {
        @Autowired private JobService<A,J> jobService;
    }