我可以同时使用泛型和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,但是它仍然给我一个编译时错误。刚刚学习类型擦除,是否是因为这个错误?我该如何解决这个问题?

最佳答案

您已经开始使用良好的模式。下一步是为每种实体类型创建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()方法。

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

07-22 09:55