首页 > 解决方案 > 具有 @DiscriminatorValue 的多个对象的单个存储库

问题描述

@DiscriminatorValue我有几个实体与一个基类共享同一个数据库表:

@Entity(name = "base_details")
@DiscriminatorColumn(name = "type")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Getter
@Setter
public abstract class BaseDetails {

    @Id
    @Column(name = "identifier")
    private String identifier;

    @Column(name = "item_type")
    @Enumerated(EnumType.STRING)
    private Type type;

}

@Entity
@DiscriminatorValue("ONE")
@Getter
@Setter
public class FirstDetails extends BaseDetails {
...
}

@Entity
@DiscriminatorValue("TWO")
@Getter
@Setter
public class SecondDetails extends BaseDetails {
...
}

这工作正常,但我遇到了一个有太多独立存储库的问题:

@Repository
public interface OneDetailsRepository extends JpaRepository<OneDetails, String> { ... }

等等

有没有办法拥有一个BaseDetailsRepository可以与所有派生实体一起使用的单一存储库(eq.)?

编辑:我正在寻找的是这样的:

@Repository
public interface BaseDetailsRepository extends JpaRepository<? extends BaseDetails, String> { 
    OneDetails findOne(String identifier);
    SecondDetails findOne(String identifier);
}

标签: javaspring-bootspring-repositories

解决方案


@NoRepositoryBean    // Read only repository
public interface BaseDetailsRepository<T extends BaseDetails> 
extends JpaRepository<T, String> {  
 T findOne(String identifier);
 T findOne(Long id);
 Iterable<T> findAll();
 Iterable<T> findAll(Sort sort);
 Page<T> findAll(Pageable pageable);
}

您还可以为每个实体拥有三个存储库:

 @Transactional
public interface BaseRepository extends BaseDetailsRepository<BaseDetails> {   }
@Transactional
public interface FirstDetailsRepository extends BaseDetailsRepository<BaseDetails>,JpaRepository<T extends BaseDetails, String>{ }

@Transactional
public interface SecondDetailsRepository extends BaseDetailsRepository<BaseDetails>,JpaRepository<T extends BaseDetails, String> {  }

推荐阅读