Сложный первичный ключ с использованием гибернации с аннотацией

#java #hibernate #jpa #annotations

#java #гибернация #jpa #аннотации

Вопрос:

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

Я знаю, что было задано несколько вопросов по этому вопросу, но я не могу найти решение…

Вот мой класс :

 @Entity
class A {
    // primary key for table
    @GeneratedValue
    @Id
    private long tableId;

    // id -> should be generated as (1  (max id of type 'type'))
    @Formula("1 (select t.id from mytable t where t.type=type)") 
    private long id;

    // type 
    private String type;
}         
  

Я думал о аннотации @Formula, но я не могу заставить ее работать…

возникло исключение :

java.sql.SQLException: поле 'id' не имеет значения по умолчанию 

Я не уверен, что @Formula это хорошее решение…

Кто-нибудь имеет представление о том, как я могу заставить это работать?

Большое спасибо,

Ben

Ответ №1:

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

 @Formula(value = "(select t.id 1 from mytable t where t.type=type)") 
private long id;
  

Комментарии:

1. Это исправило возникновение исключения, но на самом деле я неправильно понял использование этой аннотации: мое поле «id» больше не является столбцом таблицы…

Ответ №2:

Я решил свою проблему, используя аннотацию @prePersist.

 @PrePersist
private void generateId() {

    if(id>0){
        return;
    }
    id=  type.lastChronoId;
    type.save();
}
  

с типом, измененным на класс типа, содержащий индекс последнего созданного объекта.