Ошибка при добавлении записи в БД через Hibernate

121
14 ноября 2019, 13:30

Имеется БД со схемой и таблицей внутри с полями id и url, пытаюсь добавить информацию (id и url) в БД PostgreSQL через Hibernate, вываливается ошибка:

org.hibernate.PersistentObjectException: detached entity passed to persist: Hibernate.model.UrlModel

Класс UrlModel:

import javax.persistence.*;
@Entity
@Table(name = "testbase", schema = "testschema")
public class UrlModel {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    private String url;
    public UrlModel(int id, String url){
        this.id = id;
        this.url = url;
    }
    public UrlModel() {}
    public int getId() {
        return id;
    }
    public String getUrl() {
        return url;
    }
    public void setId(int id) {
        this.id = id;
    }
    public void setUrl(String url) {
        this.url = url;
    }
    @Override
    public String toString() {
        return "UrlModel{" +
                "id=" + id +
                ", url='" + url + '\'' +
                '}';
    }
  }

Класс TestHibernate:

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
public class TestHibernate {
    public static void main(String[] args){
        new TestHibernate().startTestHibernate();
    }
    private void startTestHibernate(){
        EntityManager entityManager = getEntityManager();
        entityManager.getTransaction().begin();
        UrlModel urlModel = new UrlModel(1, "https://www.github.com");
        entityManager.persist(urlModel);
        entityManager.getTransaction().commit();
    }
    private static EntityManager getEntityManager() {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("persistenceTest");
        return emf.createEntityManager();
    }
}

persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<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="persistenceTest"
                      transaction-type="RESOURCE_LOCAL">
        <!--<description>Hibernate EntityManager Demo</description>-->
        <class>Hibernate.model.UrlModel</class>
        <!--<exclude-unlisted-classes>true</exclude-unlisted-classes>-->
            <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQL95Dialect"/>
            <property name="hibernate.hbm2ddl.auto" value="update"/>
            <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/>
            <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost:5432/postgres"/>
            <property name="javax.persistence.jdbc.user" value="postgres"/>
            <property name="javax.persistence.jdbc.password" value="admin"/>
        </properties>
    </persistence-unit>
</persistence>
Answer 1
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;

Добавляя аннотацию @GeneratedValue Вы указываете Hibernate-у генерировать идентификатор. В тоже время

UrlModel urlModel = new UrlModel(1, "https://www.github.com");

Вы самостоятельно присваиваете идентификатор сущности при ее создании. При вызове метода persist

entityManager.persist(urlModel);

Hibernate видит, что у сущности уже есть идентификатор и выкидывает ошибку. Все что нужно сделать, это не присваивать значение для поля id и не использовать примитивный тип для идентификатора:

@Entity
public class UrlModel {
    @Id
    @GeneratedValue
    private Long id;
    private String url;
    // Этот конструктор будет использовать только Hibernate
    protected UrlModel() {}
    public UrlModel(String url) {
        this.url = url;
    }
    // Геттеры, сеттеры
    // Метод setId() не нужен!
}
READ ALSO
Логирование подготовленного запроса в groovy

Логирование подготовленного запроса в groovy

Мне требуется логировать подготовленные запросы в groovy

113
Выполнить метод дочернего класса

Выполнить метод дочернего класса

Есть родительский класс,который является абстракцией при создании экземпляров дочерних классовКак можно с инстанса родителя, получить...

135
Telegram bot Java

Telegram bot Java

Реализую телеграм бота для парсингаПрокси работает, бот отвечает на слова, а вот парсинг работает не как ожидается и не выводит на экран почему?

130
не запускается javaFX jar-ник

не запускается javaFX jar-ник

Сделал два эксперимента с использованием javaFx и Swing где оба этих проекта заворачиваю в банку (Eclipse)первым экспортировал Swing проект по двойному...

155