JpaRepository保存方法的通用参数

时间:2017-02-10 11:59:27

标签: java spring hibernate generics

问题:

My Domain-Layer有几个ValueClasses,它们都扩展了AbstractValue类,这个AbstractValue类扩展了一个BaseEntity类。

public abstract class AbstractValue extends BaseEntity{}

public class Value extends AbstractValue{}

在我的Repository-Layer I中使用Spring-Data-Repositories,它将自动实现。就像在域层中一样,有某种AbstractValueRepository扩展了CrudRepository接口,还有一些ValueRepositories扩展了AbstractValueRepository。

@NoRepositoryBean
public interface AbstractValueRepository<T extends AbstractValue> extends CrudRepository<T, Long> {}

public interface ValueRepository extends AbstractValueRepository<Value>

在我的业务层中,我有一个ValueService接口,其中包含一些方法和实现类,以及列出所有可用ValueRepositories的枚举。

public enum ValueType {

    VALUE(ValueRepository.class),
    VALUE1(Value1Repository.class),
    VALUE2(Value2Repository.class),
    VALUE3(Value3Repository.class),
    ;

    private final Class<? extends AbstractValueRepository<? extends AbstractValue>>     repository;

    ValueType(final Class<? extends AbstractValueRepository<? extends AbstractValue>> repository) {
        this.repository = repository;
    }

    public Class<? extends AbstractValueRepository<? extends AbstractValue>> getRepository() {
        return repository;
    }
}

@Service
public class ValueServiceImpl implements ValueService {

    @Autowired 
    private ApplicationContext applicationContext;

    @Autowired
    private ApplicatieRepository applicatieRepository;

    @Override
    public <S extends AbstractValueType> S updateValueForType(ValueType type, S value) {
        return applicationContext.getBean(type.getRepository()).save(value);
    }

    @Override
    public <S extends AbstractValueType> S createValueForType(ValueType type, S value) {
        return applicationContext.getBean(type.getRepository()).save(value);
    }
}

现在的问题是,类型S的值扩展AbstractValueType的save方法不存在。 CrudRepository就是这样做的。

@NoRepositoryBean
public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID> {
    <S extends T> S save(S var1);
}

因此,基本上save方法需要从存储库中给出的Type扩展的类型的值,在ValueRepository的情况下是Value(扩展AbstractValue),但在Service中,save方法使用Type S扩展AbstractValue。我一直在寻找修复工具以使其工作,我认为它有点像这样(虽然这种语法是错误的)

@Override
public <S extends AbstractValueType> S updateValueForType(ValueType type, T <? extends S> value) {
    return applicationContext.getBean(type.getRepository()).save(value);
}

虽然这不正确但我觉得这就是我需要搜索的方向。任何帮助都会受到赞赏,非常感谢。

0 个答案:

没有答案