Ошибки при изменении MySql для PostgreSQL в Java с помощью приложения Hibernate - PullRequest
0 голосов
/ 08 февраля 2019

Я пытаюсь перенести мое приложение из MySql в PostgreSQL.Это просто очень маленькое приложение, над которым я работаю.Всего 5 или 6 таблиц.

Итак, я заново создаю ту же базу данных в postgresql, я узнал, что пользовательское слово зарезервировано для postgress и что первичный ключ должен иметь тип Serial.

Итак, посленекоторые незначительные изменения, Hibernate работал, я могу воссоздать модели непосредственно из БД.

Первая проблема, с которой я столкнулся, это то, что, когда я пытаюсь что-то сохранить, он добавляет 0 как PK.Так как в Java «null» int равно 0 (или, допустим, unassign int равно 0), когда я получаю этот объект из базы данных (для которого PK равен 0), и я создаю новый объект, он выдаёт мне ошибку:

A different object with the same identifier value was already associated with the session 

Вот как я хранил сущности.

public Object addOrUpdate(Object item) throws Exception {
        sessionFactory.getCurrentSession().saveOrUpdate(item);
        return item;
    }

После некоторого Google я заменяю saveOrUpdate на merge, но, хотя я не получил эту ошибку, все значения, где заменяется первый (который имеет PK 0).Итак, я закончу в базе данных, последний объект был тот, который был сохранен.

Это моя таблица:

enter image description here

id (последний столбец) был создан как BigSerial.

И это модель на Java, созданная Hibernate из моего postgresql

@Id

    @Column(name = "id", unique = true, nullable = false)
    public long getId() {
        return this.id;
    }

    public void setId(long id) {
        this.id = id;
    }

Я использую Java1.8 и PostgreSQL 10.

Так, как я могу продолжать использовать postgresql, но избежать этих проблем?

1 Ответ

0 голосов
/ 08 февраля 2019

Вам нужно добавить дополнительную аннотацию, если вы хотите поддерживать автоинкремент в спящем режиме.

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
private int id;

Сгенерированная аннотация значений требуется для автоматического увеличения значений.Существует четыре различных типа стратегий генерации.

1) GenerationType.AUTO

2) GenerationType.IDENTITY

3) GenerationType.SEQUENCE

4) GenerationType.TABLE

Обратитесь к следующей ссылке для объяснения

https://thoughts -on-java.org / jpa-generate-primary-keys /

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...