java – org.hibernate.PersistentObjectException:分离的实体传递到持久化 – 使用JPA

前端之家收集整理的这篇文章主要介绍了java – org.hibernate.PersistentObjectException:分离的实体传递到持久化 – 使用JPA前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在创建一个简单的应用程序,只需在表中插入一行(如果表不存在,创建它)使用 Java JPA.

我已经在google上看过,在这里,我仍然不明白这是什么异常.即使这里有与我同样的问题的问题,但我没有得到解决方案.我还是Java JPA的新手,所以请光着我.

我附加了一些代码来运行它的例子.

回到这个问题,这是我得到的异常和stacktrace:

  1. EXCEPTION -- > org.hibernate.PersistentObjectException: detached entity passed to persist: view.Person
  2. javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: view.Person
  3. at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1763)
  4. at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1677)
  5. at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1683)
  6. at org.hibernate.jpa.spi.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:1187)
  7. at view.TestJPA.main(TestJPA.java:34)
  8. Caused by: org.hibernate.PersistentObjectException: detached entity passed to persist: view.Person
  9. at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:139)
  10. at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:75)
  11. at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:811)
  12. at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:784)
  13. at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:789)
  14. at org.hibernate.jpa.spi.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:1181)
  15. ... 1 more

这里是我的代码

主班:

  1. package view;
  2.  
  3. import javax.persistence.EntityManager;
  4. import javax.persistence.EntityManagerFactory;
  5. import javax.persistence.EntityTransaction;
  6. import javax.persistence.Persistence;
  7.  
  8. public class TestJPA {
  9.  
  10. public static void main(String[] args) {
  11.  
  12. Person p = new Person(1,"Peter","Parker");
  13.  
  14. EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("TesePersistentUnit");
  15. EntityManager entityManager = entityManagerFactory.createEntityManager();
  16.  
  17. EntityTransaction transaction = entityManager.getTransaction();
  18. try {
  19. transaction.begin();
  20.  
  21. entityManager.persist(p);
  22. entityManager.getTransaction().commit();
  23. }
  24. catch (Exception e) {
  25. if (transaction != null) {
  26. transaction.rollback();
  27. }
  28. System.out.println("EXCEPTION -- > " + e.getMessage());
  29. e.printStackTrace();
  30. }
  31. finally {
  32. if (entityManager != null) {
  33. entityManager.close();
  34. }
  35. }
  36. }
  37. }

和人类:

  1. package view;
  2.  
  3. import javax.persistence.Entity;
  4. import javax.persistence.GeneratedValue;
  5. import javax.persistence.GenerationType;
  6. import javax.persistence.Id;
  7. import javax.persistence.Table;
  8.  
  9. @Entity
  10. @Table(name = "People")
  11. public class Person {
  12.  
  13. @Id
  14. @GeneratedValue(strategy = GenerationType.AUTO)
  15. private int id;
  16.  
  17. private String name;
  18. private String lastName;
  19.  
  20. public Person(int id,String name,String lastName) {
  21. this.id = id;
  22. this.name = name;
  23. this.lastName = lastName;
  24. }
  25.  
  26. public Person() {
  27. }
  28. }

这是我的persistence.xml文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <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">
  3. <persistence-unit name="TesePersistentUnit" transaction-type="RESOURCE_LOCAL">
  4. <provider>org.hibernate.ejb.HibernatePersistence</provider>
  5. <class>view.Person</class>
  6. <properties>
  7. <!-- sql dialect -->
  8. <property name="hibernate.dialect" value="org.hibernate.dialect.MysqLDialect"/>
  9.  
  10. <property name="javax.persistence.jdbc.url" value="jdbc:MysqL://localhost:3306/tese_tabelas?zeroDateTimeBehavior=convertToNull"/>
  11. <property name="javax.persistence.jdbc.user" value="root"/>
  12. <property name="javax.persistence.jdbc.driver" value="com.MysqL.jdbc.Driver"/>
  13. <property name="javax.persistence.jdbc.password" value=""/>
  14.  
  15. <!-- Create/update tables automatically using mapping Metadata -->
  16. <property name="hibernate.hbm2ddl.auto" value="update"/>
  17. </properties>
  18. </persistence-unit>
  19. </persistence>

———————–编辑————————– –

我只是将提供程序更改为EclipseLink,而无需进一步更改.我现在很困惑.为什么它与EclipseLink一起工作,但是使用Hibernate会产生异常?

解决方法

尝试使用下面的代码,然后,它将允许您手动设置ID.

只需使用@Id注释即可定义哪个属性是您实体的标识符.如果您不希望hibernate为您生成属性,则不需要使用@GeneratedValue注释.

分配 – 允许应用程序在调用save()之前为对象分配一个标识符.这是默认策略,如果没有< generator>元素被指定.

  1. package view;
  2.  
  3. import javax.persistence.Entity;
  4. import javax.persistence.GeneratedValue;
  5. import javax.persistence.GenerationType;
  6. import javax.persistence.Id;
  7. import javax.persistence.Table;
  8.  
  9. @Entity
  10. @Table(name = "People")
  11. public class Person {
  12. @Id
  13. //@GeneratedValue(strategy = GenerationType.AUTO) // commented for manually set the id
  14. private int id;
  15.  
  16. private String name;
  17. private String lastName;
  18.  
  19. public Person(int id,String lastName) {
  20. this.id = id;
  21. this.name = name;
  22. this.lastName = lastName;
  23. }
  24.  
  25. public Person() {
  26. }
  27. }

猜你在找的Java相关文章