我有一个基本实体类BaseDictionary
:
@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但这不适合我的情况,因为我在运行时只有实体类的名称,并且不知道如何为类创建动态存储库。
答案 0 :(得分:1)
您可以编写自己的animation-play-state
实现来实现此目的。
第1步:存储库注册表
JpaRepository
第2步:自定义
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); } }
实施以填充注册表
JpaRepository
您必须调整配置才能使用自定义实现。有关详细信息,请参见Spring Data JPA文档。
第3步:从注册商处获取存储库引用
@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);
}
}