Есть ли способ создать последовательность строк, используя @GeneratedValue с префиксом?

Я хочу создать последовательность с префиксом "CID_00001" (пример):

@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE)   
private String id;

Есть какой-либо способ сделать это ?

зачем ему этот префикс?

Stultuske 09.04.2019 09:50

вы можете использовать genericGenerator, проверьте этот stackoverflow.com/questions/47259048/…

sam3131 09.04.2019 10:16
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
3 277
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я думаю, вы используете последовательность базы данных для создания ПК. Поэтому добавьте триггер перед вставкой в ​​таблицу. например, (в оракуле)

CREATE OR REPLACE TRIGGER sometable_trigger  
BEFORE INSERT ON SomeTable
FOR EACH ROW

BEGIN
  SELECT 'CID_' || to_char(sometable_seq.NEXTVAL, "00009")
  INTO   :new.id
  FROM   dual;
END;
/

предположение: имя последовательности как "sometable_seq" и идентификатор имени столбца идентификатора

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

Вы можете сделать это, используя генератор пользовательских идентификаторов.

Самый простой способ — расширить SequenceStyleGenerator Hibernate, который реализует доступ к последовательности базы данных (включая несколько интересных оптимизаций).

public class StringPrefixedSequenceIdGenerator extends SequenceStyleGenerator {

    public static final String VALUE_PREFIX_PARAMETER = "valuePrefix";
    public static final String VALUE_PREFIX_DEFAULT = "";
    private String valuePrefix;

    public static final String NUMBER_FORMAT_PARAMETER = "numberFormat";
    public static final String NUMBER_FORMAT_DEFAULT = "%d";
    private String numberFormat;

    @Override
    public Serializable generate(SharedSessionContractImplementor session, Object object) throws HibernateException {
        return valuePrefix + String.format(numberFormat, super.generate(session, object));
    }

    @Override
    public void configure(Type type, Properties params, ServiceRegistry serviceRegistry) throws MappingException {
        super.configure(LongType.INSTANCE, params, serviceRegistry);
        valuePrefix = ConfigurationHelper.getString(VALUE_PREFIX_PARAMETER, params, VALUE_PREFIX_DEFAULT);
    numberFormat = ConfigurationHelper.getString(NUMBER_FORMAT_PARAMETER, params, NUMBER_FORMAT_DEFAULT);
    }
}

После того, как вы внедрили свой собственный генератор идентификаторов, вы можете сослаться на него в аннотации @GenericGenerator.

@Entity
public class Book {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "book_seq")
    @GenericGenerator(
        name = "book_seq", 
        strategy = "org.thoughts.on.java.generators.StringPrefixedSequenceIdGenerator", 
        parameters = {
            @Parameter(name = StringPrefixedSequenceIdGenerator.INCREMENT_PARAM, value = "50"),
            @Parameter(name = StringPrefixedSequenceIdGenerator.VALUE_PREFIX_PARAMETER, value = "CID_"),
            @Parameter(name = StringPrefixedSequenceIdGenerator.NUMBER_FORMAT_PARAMETER, value = "%05d") })
    private String id;

    ...
}

@ThorbenJanssen, сэр, таким образом мы получаем таблицу hibernate_sequence. Как получить отдельные таблицы с точки зрения сущности. Нравится @SequenceGenerator(name = "batch_seq", sequenceName = "batch_seq", initialValue = 1, allocationSize=1)

Dhanushka sasanka 25.09.2019 19:55

Привет, Торбен, в этом -- @Parameter(name = StringPrefixedSequenceIdGenerator.INCREMENT_PARAM, value = "50") . что представляет собой значение 50 и что меняет изменение числа при генерации идентификатора?

Hem M 29.06.2020 12:11

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