我对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>
可以吗?
答案 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 ) );
}
}
}