【问题标题】:Persist always generates an insert queryPersist 总是生成一个插入查询
【发布时间】:2016-03-08 19:12:34
【问题描述】:

首先,我使用的是 EclipseLink 2.5.2、ojdbc6、spring-orm 4.1.1 和 QueryDSL 3.7.1。

我不明白为什么我的对象不在我的持久化上下文中(或者它应该是这样吗?)。 我正在使用 QueryDSL 来查询我的对象,但是当我尝试使用 entitymanager.persist() 保留这样的对象时,它总是会创建一个插入语句,从而导致重复的主键异常。 在对象上调用refresh() 会导致java.lang.IllegalArgumentException: Can not refresh not managed object 崩溃。使用merge() 可以正常工作,但这不是我想要的。我需要保留对已保存对象的原始引用。

persistence.xml

<persistence version="2.0"
    xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">

    <persistence-unit name="XXXXXX"
        transaction-type="RESOURCE_LOCAL">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <jta-data-source>jdbc/XXXXX</jta-data-source>
        <exclude-unlisted-classes>false</exclude-unlisted-classes>
        <properties>
            <property name="eclipselink.weaving" value="static" />
            <property name="eclipselink.target-database" value="Oracle11" />
        </properties>
    </persistence-unit>
</persistence>

用于创建 JPAQuery 和刷新/合并/持久化的 entitymanager 是相同的。

如果您需要更多信息/配置/等。请发表评论。我真的被困住了,无法理解可能是什么原因以及其他哪些信息可能对你们有用。

【问题讨论】:

  • 您是否要保留包含 id 的对象?我猜是pk
  • 不要描述你的代码。发表它。没有理由对从查询中获得的对象调用persist()。 persist 用于插入新实体。如果您从查询中获得它们,那么它们就不是新的。
  • 不能帮助 whitout 完整的类,但我猜问题是你试图持久化一个已经存在于数据库中的对象,这就是你得到主键异常的原因,当然是合并方法会起作用,因为它就像一个更新方法......
  • 是的。而已。我正在阅读诸如 stackoverflow.com/questions/1069992/… 之类的 stackoverflow,并且认为 persist 与 merge 基本相同,但更好。

标签: java spring jpa eclipselink querydsl


【解决方案1】:

EntityManager.persist() 用于制作瞬态实例持久。在这种情况下,transient(Hibernate 使用的术语,但也适用于其他持久性提供程序)表示在持久性上下文或底层数据存储中没有表示的实体。它不适用于数据库中已经存在的实体。使用merge() 更新持久 实体。

有一个关于该主题的article 带有一个漂亮的状态图,表示实体可以处于的状态以及这些状态之间的转换:

【讨论】:

    猜你喜欢
    • 2013-05-31
    • 2019-09-06
    • 1970-01-01
    • 2017-10-15
    • 2011-03-22
    • 2016-01-31
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    相关资源
    最近更新 更多