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

时间:2016-06-11 21:58:13

标签: java hibernate jpa

我对JPA和Hibernate相对较新。

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

要为所有实体标记状态字段为true,每个实体存储库(我的意思是ARepository,BRepository,CRepository,DRepository,ERepository,FRepository)都有如下方法:

@Modifying
@Query("update A set status = :status")
int updateStatus(@Param("status") Boolean status);

调用代码就像aRepository.updateStatus(true),bRepository.updateStatus(true),cRepository.updateStatus(true)等所有7个实体......

我需要停止对每个存储库的调用并调用commonrepository.updateStatus(true)之类的东西,其中commonrepository是一个实例,对象可以是每个存储库(我知道每个存储库都是接口,所以我很困惑)。 / p>

可以吗?

4 个答案:

答案 0 :(得分:1)

您可以使用CommonRepository注释创建NoRepositoryBean,在此存储库中添加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
}

使您的存储库扩展CommonRepository

@Repository
public interface ARepository extends CommonRepository<EntityA, Long> {

}

@Repository
public interface BRepository extends CommonRepository<EntityB, Long> {

}

答案 1 :(得分:0)

从技术上讲,您可以创建一个执行所有更新的类,并让该类实现所有编程的接口以响应每个不同的存储库。我不确切地知道这是否会对你的情况有所帮助,但似乎你正在使它非常紧密耦合,这有助于让一个类可以通过引用它来传递所有这些。

答案 2 :(得分:0)

创建对象时设置默认值。也许默认构造函数是正确的地方。只需在共同实体中设置值即可。

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

答案 3 :(得分:0)

为了建立UUID给出的答案,你可以构建一个包装bean,用你的春天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 ) );
    }
  }
}