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