Идентификаторы для этого класса должны быть назначены вручную перед вызовом сохранения для идентификатора строки

Я уже прочитал много вопросов по той же проблеме, но я все еще не могу решить эту проблему.

Мне нужен первичный ключ String в моей базе данных.

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class MyClass {

    @Id
    private String myId;
    private String name;

    // getters and setters..

}

Проблема в том, что если я использую тип String в аннотированном поле @Id, Hibernate выдает исключение, когда я пытаюсь сохранить объект.

ids for this class must be manually assigned before calling 

И да, я устанавливаю значение в поле.

Я нашел обходные пути:

  1. Добавить в поле аннотацию @GeneratedValue - не получилось
  2. Сменить тип поля на Integer - для меня это нереально
  3. Добавить конструктор, который получает myId в качестве параметра public MyClass(String myId){ ... } - не сработало
  4. Использовать UUID - я не могу, потому что этот идентификатор задается полем, которое поступает с запросом POST.

Ни один из этих способов не помог мне.

ОБНОВИТЬ

Я использую Spring Boot и Spring Data JPA.

Как мне вставить:

У меня есть аннотированный метод @PostMapping, который обрабатывает запрос POST и вызывает службу, которая выполняет некоторую бизнес-логику и вызывает мой репозиторий для сохранения.

Просьба размещаю:

{
    "myId": "myId",
    "name": "myName"
}

MyService.java

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class MyService {

    @Autowired
    private MyRepository myRepository;

    public MyClass save(MyClass myClass) {
        return myRepository.save(myClass); // save() should persist my object into the database
    }
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
0
8 975
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

попробуйте этот подход

@Entity
public class MyClass{

    @Id
    @GeneratedValue(generator = “UUID”)
    @GenericGenerator(
        name = “UUID”,
        strategy = “org.hibernate.id.UUIDGenerator”,
    )
    @Column(name = “id”, updatable = false, nullable = false)
    private UUID id;

    …
}

======================================

Я вызываю это так, и в моем окружении все работает нормально:

@Autowired
private EntityManager entityManager;

@PostMapping("")
@Transactional
public void add(@RequestBody MyClass myClass){
        entityManager.persist(myClass);
}

и требуется отправить по почте с телом:

{
    "myId" : "213b2bbb1"
}

Я не могу использовать UUID. Этот первичный ключ задается полем, которое поступает в запросе POST.

Matheus Cirillo 24.08.2018 22:12

@MatheusCirillo хорошо, попробуйте добавить только @GeneratedValue (стратегия = GenerationType.AUTO) для частной String myId;

Piotr R 24.08.2018 22:25

К сожалению, возникают другие ошибки. "Unknown integral data type for ids : java.lang.String; nested exception is org.hibernate.id.IdentifierGenerationException: Unknown integral data type for ids : java.lang.String"

Matheus Cirillo 24.08.2018 22:27

@MatheusCirillo, мой вопрос, как вы вставляете запись? вы используете entityManager.persist?

Piotr R 24.08.2018 22:35

Убедитесь, что вы отправили myId как не null

Piotr R 24.08.2018 22:46

Я использую Spring Data JPA. Обновлен вопрос, описывающий, как я сохраняю данные.

Matheus Cirillo 24.08.2018 22:58

перейдите на entityManager.persist(myClass) и убедитесь, что myId не равен нулю, он должен работать

Piotr R 24.08.2018 23:05

Другие вопросы по теме