Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中按实体类型检索存储库_Java_Hibernate_Generics - Fatal编程技术网

Java中按实体类型检索存储库

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

我正在编写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 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()