java - 我如何修复 org.hibernate.PersistentObjectException 错误?

标签 java hibernate

我正在尝试连接 MySQL 数据库并向数据库插入一个新用户。我的数据库名称是 bookstoredb,表名称是 users。我尝试使用 hibernate 和 jpa 创建模型类,但我收到 PersistentObjectException 错误。什么我做错了吗?

错误列表:

May 16, 2020 7:17:03 PM org.hibernate.jpa.internal.util.LogHelper logPersistenceUnitInformation
INFO: HHH000204: Processing PersistenceUnitInfo [
    name: BookStoreWebsite
    ...]
May 16, 2020 7:17:04 PM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {5.2.12.Final}
May 16, 2020 7:17:04 PM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
May 16, 2020 7:17:04 PM org.hibernate.annotations.common.reflection.java.JavaReflectionManager 
<clinit>
INFO: HCANN000001: Hibernate Commons Annotations {5.0.1.Final}
May 16, 2020 7:17:04 PM 
org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!)
May 16, 2020 7:17:04 PM 
org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001005: using driver [com.mysql.cj.jdbc.Driver] at URL 
[jdbc:mysql://localhost:3306/bookstoredb?serverTimezone=UTC&useSSL=false]
May 16, 2020 7:17:04 PM 
org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001001: Connection properties: {user=root, password=****}
May 16, 2020 7:17:04 PM 
org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001003: Autocommit mode: false
May 16, 2020 7:17:04 PM org.hibernate.engine.jdbc.connections.internal.PooledConnections <init>
INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
May 16, 2020 7:17:04 PM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect
Exception in thread "main" javax.persistence.PersistenceException: 
org.hibernate.PersistentObjectException: detached entity passed to persist: 
com.bookstore.entity.Users
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:149)
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:157)
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:164)
    at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:789)
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:767)
    at UsersTest.main(UsersTest.java:17)
Caused by: org.hibernate.PersistentObjectException: detached entity passed to persist: 
com.bookstore.entity.Users
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:124)
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:58)
at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:782)
... 2 more

我的 persistence.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<persistence 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"
version="2.1">

<persistence-unit name="BookStoreWebsite">
    <properties>
        <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/bookstoredb?serverTimezone=UTC&amp;useSSL=false" />
        <property name="javax.persistence.jdbc.user" value="root" />
        <property name="javax.persistence.jdbc.password" value="password" />
        <property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver" />
    </properties>
</persistence-unit>
</persistence>

我的 POJO 类:

package com.bookstore.entity;

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

@Entity
 public class Users {
    private Integer userId;
    private String email;
    private String fullName;
    private String password;

    @Column(name="user_id")
     public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

@Column(name="full_name")
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
public String getFullName() {
    return fullName;
}

public void setFullName(String fullName) {
    this.fullName = fullName;
}

public String getPassword() {
    return password;
}

public void setPassword(String password) {
    this.password = password;
}

}

我的 POJO 测试类:

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

import com.bookstore.entity.Users;

public class UsersTest {

public static void main(String[] args) {
    Users user1=new Users();
    user1.setEmail("dagidirnilgun@gmail.com");
    user1.setFullName("Nilgün Dağıdır");
    user1.setPassword("helloworld");
    EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("BookStoreWebsite");
    EntityManager entityManager=entityManagerFactory.createEntityManager();
    entityManager.getTransaction().begin();
    entityManager.persist(user1);
    entityManager.getTransaction().commit();
    entityManager.close();
    entityManagerFactory.close();
    System.out.println("Successfully inserted");
     }
 }

我的包裹:

Packages:

最佳答案

您已将 fullName 定义为 Users 的唯一键,但同时使用 @GenerateValue(strategy=GenerationType.IDENTITY).在您的测试中,您手动设置了此值,因此 persist 失败。 persist 操作(顾名思义)适用于没有设置 id 的全新对象,但由于您设置了 fullName ,您基本上是在尝试保留一个分离的实体。

关于java - 我如何修复 org.hibernate.PersistentObjectException 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61842488/

相关文章:

java - 相机卡住 (Android)

java - Hibernate删除关系manyToMany

java - 在数据库中插入空值

java - 没有带有 @XmlElementDecl 的 ObjectFactory

java - 使用 hibernate 和 mysql 检索多态实体

java - HQL 并检查对象是否为空或对象字段是否具有特定值

hibernate - 尝试在域中查找空值时,grails方法缺少异常

java - org.hibernate.MappingException : Repeated column in mapping for entity:. ..column:added_by(应使用 insert ="false"update ="false"进行映射)

java - 是否可以在运行时从数据库模式生成 JPA 实体类?

java - 为不同的时间字符串接收相同的 ZonedDateTime