一尘不染

使用泛型和jpa EntityManager方法

hibernate

我可以同时使用泛型和JPA吗?

我试图将四个类的对象保留到我的数据库中。这是我的PersistService类别:

public class PersistService<T> {
private static EntityManagerFactory emf = Persistence.createEntityManagerFactory("fileUploadProject");

public static EntityManager getEntityManager() {
    return emf.createEntityManager();
}

// Write Client to Database
public static <T> void persist(T obj) {
    EntityManager em = getEntityManager();
    EntityTransaction et = em.getTransaction();
    et.begin();
    em.persist(obj);
    et.commit();
    em.close();
}
}

但是后来我遇到了删除对象的问题。除上述内容外,我在PersistService类中还有以下方法:

// Remove an object from the Database if they exist
public static <T> void remove(Long id) {
    EntityManager em = getEntityManager();
    EntityTransaction et = em.getTransaction();
    <T> obj = em.find(<T>.class, id);
}

最后一行给我一个编译时错误。我试着<T>.class T
Class<T>T.class好,但它仍然给了我一个编译时错误。刚刚学习类型擦除,是因为这个错误吗?我该如何解决这个问题?


阅读 624

收藏
2020-06-20

共1个答案

一尘不染

您已经开始使用良好的模式。下一步是为每种实体类型创建PersistService的子类。我还将提到,从长远来看,您可能希望为每个实体都有一个通用的基类或接口。例如,我将其称为Entity。该基类(如果是类而不是接口)可以是抽象的,并且可以为所有实体定义通用方法。

public interface Entity {
    long getId();
}

您可以使用Entity在的实现中定义的方法PersistService(当您在此基本服务或代码的其他位置添加更多与实体相关的通用业务逻辑时,可能会发现它们很方便)。

您的实体A看起来像

public class A extends Entity {
}

PersistService成为

public abstract class PersistService<T extends Entity> {
    // Your common methods (persist, remove, etc.).
    public abstract Class<T> getEntityClass();
}

您的特定于实体的服务如下所示

public class APersistService extends PersistService<A> {
    public Class<A> getEntityClass() {
        return A.class;
    }
}

然后getEntityClass(),您可以在实现时使用该方法PersistService.remove()

尽管特定于实体的子类解决了面对类型擦除的特定类对象的问题,但您最终会发现您希望该子类也支持特定于实体的查询。

2020-06-20