Java 如何为不同实体创建通用方法

Java 如何为不同实体创建通用方法,java,hibernate,jpa,Java,Hibernate,Jpa,我对JPA和Hibernate比较陌生 我有7个不同的非相关实体A、B、C、D、E和F。它们都扩展了一个名为PARENT的公共实体,该实体具有id、created_date和status字段 要将所有实体的状态字段标记为true,每个实体存储库(我指的是ARepository、BRepository、CRepository、Drpository、Erpository、FRepository)有如下方法: @Modifying @Query("update A set status = :stat

我对JPA和Hibernate比较陌生

我有7个不同的非相关实体A、B、C、D、E和F。它们都扩展了一个名为PARENT的公共实体,该实体具有id、created_date和status字段

要将所有实体的状态字段标记为true,每个实体存储库(我指的是ARepository、BRepository、CRepository、Drpository、Erpository、FRepository)有如下方法:

@Modifying
@Query("update A set status = :status")
int updateStatus(@Param("status") Boolean status);
调用代码类似于所有7个实体的aRepository.updateStatus(true)、bRepository.updateStatus(true)、cRepository.updateStatus(true)等等

我需要停止对每个存储库的调用,并调用类似commonrepository.updateStatus(true)的东西,其中commonrepository是每个存储库的实例,对象可以是每个存储库(我知道每个存储库本身就是接口,所以我有点困惑)


可以吗?

从技术上讲,您可以创建一个类来执行所有更新,并让该类实现所有编程的接口,以响应每个不同的存储库。我不知道这是否对您的案例有帮助,但似乎您正在使其紧密耦合,并且可能有一个类可以完成所有这些操作,并将引用传递给它。

在创建对象时设置默认值。也许默认构造函数将是执行此操作的正确位置。只需在公共实体中设置值

@Column(name = "STATUS")    
 private boolean status= true;

您可以使用
NoRepositoryBean
注释创建
CommonRepository
,并在此存储库中添加
updateStatus
方法

@NoRepositoryBean
public interface CommonRepository<T, ID extends Serializable> extends JpaRepository<T, Serializable> {

    @Modifying
    @Query("update #{#entityName} set status = :status")
    int updateStatus(Boolean status);

    // Other methods
}

为了构建UUID给出的答案,您可以构建一个包装bean,它通过一点spring voodu实现您的要求:

@Component
public CommonRepositoryStatusUpdater {
  // spring will inject this list if it finds any; otherwise it is null.
  @Autowired(required = false)
  private List<CommonRepository<?,?>> commonRepositories;

  // updates the status of any detected CommonRepositories.
  public void updateStatus(Boolean value) {
    if ( commonRepositories != null ) {
      commonRepositories.forEach( cr -> cr.updateStatus( value ) );
    }
  }
}
@组件
公共CommonRepositoryStatusUpdater{
//如果spring找到任何列表,它将注入该列表;否则为null。
@自动连线(必需=错误)

私有列表这些实体在同一个模式中吗?你说它们不相关,但你有一个业务用例,其中所有7个存储库都需要将各自实体的状态设置为相同的值?也许这里需要一个数据模型重构。它已经紧密耦合。我正试图在简单的java接口概念的基础上解决这个问题t其中一个方法在child中被重写。因此,我可以创建引用接口的child类的对象。在这种情况下,我总是调用interafce.update();而不是每次类更新。JPA存储库中的问题是实体类本身就是接口的存储库。
@Component
public CommonRepositoryStatusUpdater {
  // spring will inject this list if it finds any; otherwise it is null.
  @Autowired(required = false)
  private List<CommonRepository<?,?>> commonRepositories;

  // updates the status of any detected CommonRepositories.
  public void updateStatus(Boolean value) {
    if ( commonRepositories != null ) {
      commonRepositories.forEach( cr -> cr.updateStatus( value ) );
    }
  }
}