我可以同时使用泛型和 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>
and T.class
也是如此,但它仍然给我一个编译时错误。刚刚学习类型擦除,这个错误是因为这个吗?我该如何解决这个问题?
您已经开始使用一个好的模式。下一步是为每个实体类型创建 PersistService 的子类。我还要提到,从长远来看,您可能希望每个实体都有一个公共基类或接口。例如,我将其称为Entity
。该基类(如果它是类而不是接口)可以是抽象的,并且可以为所有实体定义通用方法。
public interface Entity {
long getId();
}
您可以使用定义的方法Entity
在你的实施中PersistService
(当您在此基本服务或代码中的其他位置添加更多通用的与实体相关的业务逻辑时,您可能会发现它很方便)。
您的实体A
好像
public class A extends Entity {
}
Your PersistService
becomes
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()
.
虽然特定于实体的子类解决了在类型擦除时获取特定类对象的问题,但您会发现最终希望子类也支持特定于实体的查询。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)