gpt4 book ai didi

java - 持久化总是生成插入查询

转载 作者:行者123 更新时间:2023-12-01 10:16:14 25 4
gpt4 key购买 nike

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

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

持久性.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.persist() 用于使 transient 实例持久。在这种情况下transient (Hibernate 使用的术语,但对其他持久性提供者也有效)意味着在持久性上下文或底层数据存储中没有表示的实体。它不适用于数据库中已存在的实体。使用merge()来更新持久实体。

有一个 article关于这个主题,用一个很好的状态图来表示实体可以处于的状态以及这些状态之间的转换: Entity states

关于java - 持久化总是生成插入查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35876004/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com