2016-11-16 79 views
2

我可以一起使用泛型和JPA吗?使用泛型和jpa EntityManager方法

我试图坚持四个类的对象到我的分贝。这里是我的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>.classTClass<T>T.class,但它仍然给我一个编译时错误。刚刚了解Type Erasure,是因为这个错误吗?我该如何解决这个问题?

+0

你应该尽量让GenericDao,使子类扩展它 – BrunoDM

+0

你永远要在你的'PersistService'方法所管理的事务。您想基于业务逻辑的逻辑块来管理事务边界。通常情况下,您将执行多个数据库操作,要么全部成功,要么全部失败 - 否则系统将处于不易编码且难以恢复的不一致状态。 – Rob

+0

编译期间无法获得类类型。你会花费足够的时间和资源来寻找它。 –

回答

2

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

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

0

我可能有你正在寻找的答案,以及在编译期间使用泛型类型并不容易。由于Java不允许你直接这样做。

我有一个黑客自己,你可以尝试这样的事情吗?

请务必处理您的例外。

static <T> Class getGenericType(T t){ 
    return getType(t); 
} 
static Class<?> getType(Object o){ 
    return o.getClass(); 
}