2016-09-24 117 views
0

我有一個基礎的實體類BaseDictionary實體類名稱獲取從表中的數據:如何通過使用Spring數據JPA

@Entity 
@Inheritance 
public abstract class BaseDictionary { 
    @Id 
    @Column(name = "id") 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    protected Long id; 

    @Column(name = "code") 
    protected String code; 

    @Column(name = "is_enabled") 
    protected Boolean enabled = true; 
} 

任何子類

@Entity 
@Table(name = DB.DIC_RIGHTS_TYPE, schema = DB.SCHEMA_DIC) 
public class DicRightsType extends BaseDictionary {} 

@Entity 
@Table(name = DB.DIC_ROLES_TYPE, schema = DB.SCHEMA_DIC) 
public class DicRolesType extends BaseDictionary {} 

有很多子類這樣。

給定一個實體類名稱,例如DicRightsType我想從與該名稱的實體關聯的表中獲取數據。如何實現?

我想使用這樣的JPA存儲庫:Using generics in Spring Data JPA repositories但這不適合我的情況,因爲我只在運行時擁有實體類的名稱,並且不知道如何爲該類創建動態存儲庫。

回答

1

您可以編寫自己的JpaRepository實現來實現此目的。

步驟1:存儲庫註冊表

class RepositoryRegistrar { 
    private static final Map<Class<T>, Repository<T, Serializable>> DICTIONARY = new HashMap<>(); 

    public static void register(Class<T> entityClass, Repository<T, Serializable> repository) { 
    DICTIONARY.put(entityClass, repository); 
    } 

    public static Repository<T, Serializable> get(Class<T> entityClass) { 
    return DICTIONARY.get(entityClass); 
    } 
} 

步驟2:自定義JpaRepository執行填充註冊表

@NoRepositoryBean 
class RegisteringJpaRepository<T, ID extends Serializable> extends SimpleJpaRepository<T, ID> { 
    public RegisteringJpaRepository(JpaEntityInformation<T, ?> entityInformation, EntityManager entityManager) {{ 
    super(entityInformation, entityManager); 

    RepositoryRegistrar.register(entityInformation.getJavaType(), this); 
    } 
} 

您將不得不調整配置​​以使用您的自定義實現。在Spring Data JPA文檔中提供了這方面的細節。

步驟3:來自注冊

Repository<?, ?> getRepository(String entityClassName) { 
    return RepositoryRegistrar.get(Class.forName(entityClassName)); 
} 
+0

由於獲取資源庫引用。它有幫助。 –