当前位置: 首页 > 面试题库 >

使用泛型和jpa EntityManager方法

欧照
2023-03-14
问题内容

我可以同时使用泛型和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()

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



 类似资料:
  • 问题内容: 没有静态成员可以使用类型参数,但是可以使用泛型类型参数调用静态成员吗​​?例如:- 这里的add()是一个静态方法。 在类似的主题上也有一些C#问题和答案,但是我不太确定如何在Java中使用它。 问题答案: 不,如果A是泛型类型,则无法执行。(Bozho对fast的回答是:),可能认为A是具体类型。 可行的方法如下。 但这可能不是您想要的。 阅读您的评论后,听起来您真正想要做的是: 您

  • 我有以下两种方法: ClassA和ClassB都有相同的方法getObjValue,但它们没有关系。它们不从公共类或接口继承。由于这些方法几乎是相同的,我是否可以使用泛型来使用一个签名如下的方法来消除这段代码的重复:

  • 具有以下类别: 和 和 和 和 和 因此,应用程序需要动态实例化步骤子类对象,相应地设置配置并运行步骤,如下所示。 错误消息: "方法setConfig(捕获#8-of?扩展Config)在类型Step中 查看文档,在这种情况下,Java看起来不友好:https://docs.oracle.com/javase/tutorial/java/generics/wildcardGuidelines.h

  • 安吉丽卡·兰格(Angelica Langer)在关于仿制药的常见问题解答中说(参见Technicalities.FAQ822): 如果这些方法具有具有不同边界的类型参数,则它们不会重写,因为这些方法的签名不是重写等价的。请记住,类型参数边界是泛型方法签名的一部分。 示例(泛型子类型方法重载泛型超类型方法;不推荐): 我不明白为什么方法在类中重载。据我所知,这应该是一个编译时错误,因为在和中具有相

  • 我一直在尝试泛型,很快我就遇到了一些我无法解释的事情 例如: 我不明白

  • 我想说得具体一点。我有一个名为Result的类和一个名为Result的派生类 这些类在方法中用作返回类型。为此,我创建了这个helper类: 正如您所看到的,上面的代码对于成功有两种返回类型,一种是如果您不想返回任何东西,另一种是如果您想返回一些东西,但是失败的结果永远不会返回什么东西。这是不必要的,只是一个错误消息。这使我想到以下问题:当我想创建一个可以使用返回类型返回Success,而不使用返