Как установить первичный ключ @Id, который НЕ генерируется автоматически в Java JPA / Hibernate? - PullRequest
0 голосов
/ 25 июня 2019

Я использую Postgres с Java JPA / Hibernate и хочу, чтобы поле id было создано вручную. каждый раз, когда я создаю экземпляр этого объекта, я в любом случае устанавливаю поле id.

Я пытался в течение нескольких недель, но продолжаю сталкиваться с: "Обязательное свойство идентификатора не найдено для класса" или "После сохранения идентификатор не должен быть нулевым".

Вот пример класса модели, который я использую:

import javax.persistence.*;

@Entity
@Table(name = "pojo")
public class Pojo {

    @Id
    @Column(name = "id_one")
    private int idOne;

    @Column(name = "bool_example")
    private boolean boolExample;

    public Pojo(){};

    public Pojo(int idOne, boolean boolExample){
        this.idOne = idOne;
        this.boolExample = boolExample;
    }

    public int getIdOne() {
        return idOne;
    }

    public void setIdOne(int idOne) {
        this.idOne = idOne;
    }

    public boolean isBoolExample() {
        return boolExample;
    }

    public void setBoolExample(boolean boolExample) {
        this.boolExample = boolExample;
    }
}

Вот пример запроса, по которому я звоню

    @GetMapping(value = "/plswork")
    public String pojotestone(){
        Pojo newpojo = new Pojo(1, false);
        pojoService.saveThis(newpojo);

        pojoService.test();
        return "yes";
    }

PojoService вызывает pojoRepository.save (объект T). Этот pojoRepository от расширения CrudRepository, поэтому он создает запросы на лету

Ответы [ 2 ]

0 голосов
/ 07 июля 2019

Для всех тех, кому интересно,

ДА - возможно иметь ручной идентификатор, и это имеет смысл в нескольких случаях использования, когда сущности имеют внутренние атрибуты идентификатора.(например, кредитные карты, банковские счета и т. д.)

Что касается этой проблемы, то она оказалась несовместимой с Spring JDBC.Решение состоит в том, чтобы вместо этого использовать spring-boot-starter-data-jpa, и имеет репозитории, расширяющие JPARepository вместо CrudRepository.

0 голосов
/ 25 июня 2019

В спящем режиме у нас есть стратегии генерации идентификаторов. Вы можете использовать один из них для генерации идентификатора. Вы можете использовать аннотацию @GeneratedValue для использования одной из стратегий.

@Id
@GeneratedValue (strategy = GenerationType.IDENTITY)
private long id;

@ GeneratedValue может использовать 4 типа генерации: AUTO , IDENTITY , SEQUENCE , TABLE .

Если мы не указываем значение явно, типом генерации по умолчанию является АВТО.

Таблица - поставщик сохраняемости должен назначить первичные ключи для объекта, используя базовую таблицу базы данных, чтобы обеспечить уникальность

Sequence - указать использование последовательности базы данных для обеспечения уникальности

Идентичность - указать использование столбца идентификатора базы данных

Авто - поставщик сохраняемости должен выбрать подходящую стратегию для конкретной базы данных

Вы можете перейти по этой ссылке: - https://blog.eyallupu.com/2011/01/hibernatejpa-identity-generators.html

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