使用泛型和 jpa EntityManager 方法

2024-02-09

我可以同时使用泛型和 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(使用前将#替换为@)

使用泛型和 jpa EntityManager 方法 的相关文章

随机推荐

  • Vue JS - 访问组件内的根计算属性

    我正在尝试从根 Vue 实例访问计算属性并在组件内部访问它 这 p class currency 在组件模板外部输出的元素正确输出 currency 但是当尝试访问组件内部的 currency 时 不会输出任何内容 我尝试过将货币设置为道具
  • 使用 R 在坐标系中绘制节点和边

    我实施了FR测试here http itee uq edu au zxf papers ACMMM08 distributionn pdf现在我想通过可视化 R 中生成的最小生成树来测试它 顶点和边应该在坐标系中绘制 此外 我想为每个点设置
  • MongoDB 嵌入 Java

    我从文档中得到的是 它在其他计算机上作为单独的进程运行 我可以使用 java 的 mongo db 客户端驱动程序与它进行通信 并且我可以执行正常操作 但我怀疑我是否可以在我的java应用程序中使用MongoDB作为嵌入式数据库 我的意思是
  • 带有 UIImage 的 Swift 游乐场

    我正在使用 Xcode 6 并且正在尝试重新创建在会话 401 Xcode 6 中的新增功能 期间演示的代码 我已将图像添加到 Images xcassets 称为 Sample 并在游乐场文件中我尝试访问此图像 如演示的那样 我的代码如下
  • 为什么 React devtools Profiler 不向我显示组件属性?

    我开始学习React的优化 并看到一些学习资源 在它们上 我可以在探查器中看到组件道具 但在我的 Profiler 中 我没有看到任何道具 为什么 如何在 Profiler 中查看当前渲染组件的 props A make screensho
  • 方法:python-pdfkit 将网页(JS生成)转换为PDF

    views py def download as pdf request some stuff function call to get updated with data and JS template and render it ret
  • Laravel Eloquent:SQL 注入预防是自动完成的吗?

    给出示例代码 Message是一个雄辩的模型 public function submit Request request this gt validate request name gt required email gt require
  • 从 cypress 中的函数返回一个值[重复]

    这个问题在这里已经有答案了 import StudentDetails from Department let studentInfo new StudentDetails let studName any it Get Student N
  • 为什么我的 Qt 4.5 应用程序在 Windows 下打开控制台窗口?

    我一直在 Linux 下使用 Qt Creator 4 5 我的应用程序在 Linux 下构建得很好 但如果我在 Windows 中构建 该应用程序总是在启动时打开一个控制台窗口 我可以阻止它这样做吗 我正在使用默认的 MinGW 设置进行
  • 如何提高JPictureBox大图像的绘制速度?

    我有一个 JPictureBox 从 java awt Component 扩展 请参阅此处的代码http pastebin com SAJc6Sht http pastebin com SAJc6Sht 但只有在没有图像拉伸的情况下它才有
  • 撤销对表 pg_proc 上 postgresql 中不起作用的特定列的访问

    我的目标是仅允许特定用户执行特定模式中的函数 按名称列出可用的函数 但看不到函数的源代码或列出其他模式 通过执行以下操作 无需列出可用函数名称即可实现上述目的 首先创建一个测试用户角色 CREATE ROLE test user WITH
  • Java 做 while, while

    当我运行此代码时 我可以期待什么行为 do while testA do stuff while testB 它的行为会像 do while testA do stuff while testB Or if testA do do stuf
  • 仅针对 nginx 上的特定 url 使用 https 重定向

    我正在尝试让 https 与某些 url 一起使用 但似乎 https 无处不在 具体来说 我在 Nginx 上创建了 2 个虚拟主机 第一个虚拟主机的端口为 80 另一个虚拟主机的端口为 443 包含 SSL 现在我的网站 即domain
  • 可视化使用 ANTLR 创建的 AST(在 .Net 环境中)

    为了一个我喜欢的项目 我开始摆弄 ANTLR 在学习了一些教程之后 我现在尝试为我自己的语言创建语法并生成 AST 现在我主要在 ANTLRWorks 中闲逛 但现在我已经验证了解析树似乎没问题 我想 迭代地 因为我仍在学习 仍然需要对最终
  • 授权 Rails_admin 与 pundi

    我使用 pundit gem 进行授权 在我的档案中config initializers rails admin rb RailsAdmin config do config config authorize with pundit co
  • 如何从 C# 嵌入式资源获取文件夹名称

    我想以文件系统排序资源的方式来排序资源 我无法对名称进行 string split 因为文件夹由 分隔 字符 而不是 字符 这意味着文件夹或文件名中包含任何句点都会破坏排序 有没有办法更改分隔符 或获得嵌入资源的原始位置的不同细分 这将为您
  • Python 中的 Plotly-Dash 库存应用程序,带有客户端回调(x 轴缩放上的 y 轴自动缩放)

    我正在使用 xaxis 滑块在 dash plotly python 中创建一个简单的股票图表应用程序 滑动 x 轴时 我希望 y 轴动态重新缩放到视图 我想我已经设法在通过 relayoutData 挂钩滑动 xaxis 刻度时触发回调函
  • 迁移到 .Net4 后,C# 出现“语言不支持”错误

    我正在尝试将我们的网站从 Net 3 5 迁移到 4 但遇到了一个非常奇怪的问题 一旦我瞄准 Net4 在 3 5 中运行得很好的代码就不再运行了 给了我错误 该语言不支持 xxx TimeZoneInfo tzi calendarItem
  • 如何在 Ruby 中输出前导零?

    我正在从 Ruby 脚本输出一组编号的文件 这些数字来自递增计数器 但为了使它们在目录中很好地排序 我想在文件名中使用前导零 换句话说 文件 001 代替 file 1 有没有simple将数字转换为字符串时添加前导零的方法 我知道我可以做
  • 使用泛型和 jpa EntityManager 方法

    我可以同时使用泛型和 JPA 吗 我正在尝试将四个类的对象持久保存到我的数据库中 这是我的 PersistService 类 public class PersistService