Java中按实体类型检索存储库
我正在编写Java程序,它通过Hibernate与Db交互 我所有的持久类都是从实现接口的通用抽象类实体扩展而来的。例如:Java中按实体类型检索存储库,java,hibernate,generics,Java,Hibernate,Generics,我正在编写Java程序,它通过Hibernate与Db交互 我所有的持久类都是从实现接口的通用抽象类实体扩展而来的。例如: public interface IEntity { long getId(); void setId(long id); } public abstract class Entity implements IEntity { private long id; //get + set id } public class User exte
public interface IEntity {
long getId();
void setId(long id);
}
public abstract class Entity implements IEntity {
private long id;
//get + set id
}
public class User extends Entity {
private string name;
//get + set name
}
public class Item extends Entity {
private string description;
//get + set description
}
对于使用Db的操作,我创建了存储库类,这些存储库类使用所有实体的标准CRUD方法从存储库扩展而来,该类实现接口IRepository:
但这两个实现都未能编译。可能您对如何正确编写此方法有任何想法您可以像这样实现getByType方法我更改了参数类型:
private List<IRepository<? extends IEntity>> repositories;
@SuppressWarnings("unchecked")
public <E extends IEntity> IRepository<E> getByType(Class<E> entityClass) {
for (IRepository<?> repository : repositories) {
if (repository.getEntityClass().equals(entityClass)) {
return (IRepository<E>) repository;
}
}
throw new IllegalArgumentException(
"No repository for entity class " + entityClass.getName());
}
与
这可能会有问题,因为您可能有实体层次结构,并且可能会为对象获取错误的子类存储库。如果您不知道对象的类,可以通过Hibernate代理获取该对象:
org.hibernate.Hibernate.unproxy(object).getClass()
然后按repository.getEntityClass.EqualEntityClass比较类。请编辑问题并添加未编译的代码。您是否使用Spring、CDI或其他DI框架?好的。我将尝试添加更多细节。另外,我没有使用任何IoC框架。我用对代码的注释更新了我的答案。不知道instanceof的这个问题。解决方案现在很好用。谢谢
public class Storage {
private IRepository<? extends IEntity>[] repositories;
public <T extends IEntity, U extends IRepository<T>> U getByTypeVar1(T object) {
for (IRepository<?> repo : repositories) {
if (object instanceof repo.getEntityClass ()) // cannot resolve getEntityClass
return repo;
}
}
public <T extends IEntity, U extends IRepository<T>> U getByTypeVar2(T object) {
if (object instanceof UserRepository.getEntityClass ())
return UserRepository; //incompatible type
//more if else here
}
}
private List<IRepository<? extends IEntity>> repositories;
@SuppressWarnings("unchecked")
public <E extends IEntity> IRepository<E> getByType(Class<E> entityClass) {
for (IRepository<?> repository : repositories) {
if (repository.getEntityClass().equals(entityClass)) {
return (IRepository<E>) repository;
}
}
throw new IllegalArgumentException(
"No repository for entity class " + entityClass.getName());
}
<T extends IEntity, U extends IRepository<T>> U getByType()
<T extends IEntity> IRepository<T> getByType getByType()
object instanceof repo.getEntityClass ()
org.hibernate.Hibernate.unproxy(object).getClass()