gpt4 book ai didi

java - 组织.hibernate.PersistentObjectException : detached entity passed to persist exception

转载 作者:搜寻专家 更新时间:2023-10-30 20:58:48 26 4
gpt4 key购买 nike

我正在创建一个简单的应用程序,用于使用 Java JPA 向表中插入一行(如果表不存在,请创建它)。

我附上了它的可运行示例的一些代码。

这是我得到的异常和堆栈跟踪:

EXCEPTION -- > org.hibernate.PersistentObjectException: detached entity passed to persist: view.Person
javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: view.Person
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1763)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1677)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1683)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:1187)
at view.TestJPA.main(TestJPA.java:34)
Caused by: org.hibernate.PersistentObjectException: detached entity passed to persist: view.Person
at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:139)
at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:75)
at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:811)
at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:784)
at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:789)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:1181)
... 1 more

这是我的代码:

主类:

package view;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

public class TestJPA {

public static void main(String[] args) {

Person p = new Person(1, "Peter", "Parker");

EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("TesePersistentUnit");
EntityManager entityManager = entityManagerFactory.createEntityManager();

EntityTransaction transaction = entityManager.getTransaction();
try {
transaction.begin();

entityManager.persist(p);
entityManager.getTransaction().commit();
}
catch (Exception e) {
if (transaction != null) {
transaction.rollback();
}
System.out.println("EXCEPTION -- > " + e.getMessage());
e.printStackTrace();
}
finally {
if (entityManager != null) {
entityManager.close();
}
}
}
}

还有 Person 类:

package view;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "People")
public class Person {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;

private String name;
private String lastName;

public Person(int id, String name, String lastName) {
this.id = id;
this.name = name;
this.lastName = lastName;
}

public Person() {
}
}

这是我的 persistence.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="TesePersistentUnit" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>view.Person</class>
<properties>
<!-- SQL dialect -->
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>

<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/tese_tabelas?zeroDateTimeBehavior=convertToNull"/>
<property name="javax.persistence.jdbc.user" value="root"/>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="javax.persistence.jdbc.password" value=""/>

<!-- Create/update tables automatically using mapping metadata -->
<property name="hibernate.hbm2ddl.auto" value="update"/>
</properties>
</persistence-unit>
</persistence>

------------------------编辑-------------------- ------

我刚刚将提供程序更改为 EclipseLink,并且没有进一步更改它正在工作。我现在很困惑。为什么它与 EclipseLink 一起工作,但与 Hibernate 一起工作时会生成异常?

最佳答案

这样做的原因是您在 Person 类中声明了 id 是使用自动策略生成的,这意味着 JPA 尝试在持久化实体时插入 id 本身。但是,在您的 constructor 中,您手动设置了 id 变量。由于 ID 是手动分配的,并且实体不存在于 persistence context 这导致 JPA 认为您正在尝试持久化一个与持久性分离的实体上下文,因此是异常(exception)。

要修复它,请不要在构造函数中设置 id。

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;



public Person(int id, String name, String lastName) {
// this.id = id;
this.name = name;
this.lastName = lastName;
}

关于java - 组织.hibernate.PersistentObjectException : detached entity passed to persist exception,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25636091/

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