【问题标题】:JPA insert statementJPA 插入语句
【发布时间】:2011-03-06 08:52:39
【问题描述】:

JPA 插入语句的正确语法是什么?这听起来像是一个简单的问题,但我一直找不到答案。

我知道如何通过 Java 代码执行此操作,但我正在寻找一种在创建数据库时将对象插入数据库的方法。

有什么想法吗?

【问题讨论】:

  • 这是一个很好的例子,最不正确的答案被标记为正确的解决方案。请考虑将 frm 或 Ben Hoffstein 答案标记为有效。

标签: jpa


【解决方案1】:

JPA 中没有 INSERT 语句。您必须使用 EntityManager 插入新实体。 JPA 中唯一允许的语句是 SELECT、UPDATE 和 DELETE。

【讨论】:

  • 我已经看到本机 SQL 被用于此目的,但是如何为所有数据库提供程序编写它呢? Hibernate 有这样一个特性,你可以在 Hibernate 的运行时类路径中包含一个名为“import.sql”的文件。在模式导出时,它将在模式导出后执行该文件中包含的 SQL 语句。我正在寻找一些更通用的方法,因为我正在使用 Eclipselink。
  • 真的!,啊,我试图在 Intellij IDEA 中使用 jpa-ql 持久性控制台将记录插入数据库。
【解决方案2】:

这是关于使用 EntityManager 持久化 JPA 对象的good reference。例如,这是使用persist方法插入对象的方法:

EntityManager em = getEntityManager();
em.getTransaction().begin();

Employee employee = new Employee();
employee.setFirstName("Bob");
Address address = new Address();
address.setCity("Ottawa");
employee.setAddress(address);

em.persist(employee);

em.getTransaction().commit();

【讨论】:

  • 正如我所提到的,我知道如何从 Java 中做到这一点。我正在寻找一种在创建数据库时使用标准插入的方法,除了在 java 中对其进行硬编码。
  • 明白了 - 抱歉,误解了这个问题。
【解决方案3】:

如果你想在 java 之外的数据库中插入数据,你需要使用原生 SQL。使用 SQL 标准确保大多数数据库都可以执行脚本。当应用程序运行时,JPA 会对新数据进行映射,并在需要时将其转换为对象。

如何确保脚本适用于所有数据库?好吧,这与任何 DBA 在进行存储过程或本机查询时遇到的问题相同……这就是 JPA 存在的原因,以避免直接在 SQL 中进行,但我知道有时需要这种方式。

我建议你制作 3 个主要脚本。一种用于 Oracle,一种用于 SQL Server(2005 到 2008 版本的日期数据类型存在一些问题,所以要小心),一种用于 MySQL。使用标准 SQL 启动您的脚本,当您在此数据库中对其进行测试时,您会发现需要对每个 DBMS 进行一些修复。

如果你得到它,你可以创建一个文件脚本 (*.sql) 文件并使用 DB 管理器运行它。如果它运行服务器,将应用程序上线,数据将被很好地集成。

【讨论】:

  • 这就是我最终这样做的方式。我一直在寻找一种更自动化的方式,但我必须对其进行编码才能完成此类工作。
【解决方案4】:

目前看来更有希望的选项是使用Flyway。它是一种更自动化的方式,并且基本上自动处理数据库的升级过程。

【讨论】:

    【解决方案5】:

    无需在 JPA 中编写单独的 INSERT 查询。 JpaRepository 具有内置的saveAndFlush() 方法,您可以使用它来插入数据库。希望这对你有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-01
      • 2015-04-03
      • 1970-01-01
      • 2018-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多