gpt4 book ai didi

java - 自定义 JPA 数据存储库的基础服务

转载 作者:太空宇宙 更新时间:2023-11-04 10:42:13 25 4
gpt4 key购买 nike

I've implemented a custom JPA repository as :

public class BaseEntity{...}

public class DerivedEntity extends BaseEntity{...}

@NoRepositoryBean
public interface BaseRepository<T extends BaseEntity> extends JpaRepository<T, ID>{
//some common method
}

@Repository
public interface DerivedRepository extends BaseRepository<DerivedEntity>{
}

Now, I want created a common data-service :

public class CommonService{

private BaseRepository<? extends BaseEntity> baseRepository;


//wants to use common method by passing derivedRepository
public CommonService(BaseRepository<? extends BaseEntity> derivedRepository) {
this.baseRepository=derivedRepository;
}

}

现在,在代码中的某个地方我想使用保存方法:

public void foo(BaseEntity entity ) {
baseRepository.save(entity);
...
...
}

I'm getting compile time error:

can not resolve save

如何解决这个问题并设计?使用通用数据存储库设计通用数据服务的最佳方法是什么?

最佳答案

PECS rule :生产者扩展,消费者 super 。这是一个缩写词,可以帮助我们记住何时应该使用 super什么时候我们应该使用 extends 。在这种情况下 save()方法是一个消费者。它接收一个对象,但不返回它。所以应该是super - 它编译:

private BaseRepository<? super BaseEntity> baseRepository;
// ...
public void foo(BaseEntity entity ) {
baseRepository.save(entity);
}

但是, JpaRepository 也有生产者方法,例如 findAll() 。如果您CommonService也使用它,那么这个 private BaseRepository<? super BaseEntity> baseRepository;将会毫无用处。

还有一个解决方法:您可以在服务级别指定实体类型,并在方法级别更加灵活:

public static class CommonService {

private BaseRepository<BaseEntity> baseRepository;

public CommonService(BaseRepository<BaseEntity> derivedRepository) {
this.baseRepository = derivedRepository;
}

// here you can accept any subtype you want
public <T extends BaseEntity> void foo(T entity) {
baseRepository.save(entity);
}

// you can be flexible here
public List<? super BaseEntity> bar() {
return baseRepository.findAll();
}

}

不幸的是,其中大部分 extendssuper?迹象使该代码的用户的生活变得困难。我建议尽可能保持简单。如果这还不够,那么您可以使用泛型,直到找到满足您需求的解决方案。这将是最简单的解决方案:

    // accepts subclasses of BaseEntity
public void foo(BaseEntity entity) {
baseRepository.save(entity);
}

// reutrns a List<BaseEntity>. The _items_ of the list might be subclasses of BaseEntity.
public List<BaseEntity> bar() {
return baseRepository.findAll();
}

实现说明:

以下行未定义 ID类型。这就像 IntegerLong - BaseEntity 的字段.

public static interface BaseRepository<T extends BaseEntity> extends JpaRepository<T, ID>

关于java - 自定义 JPA 数据存储库的基础服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48849296/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com