Я хочу создать последовательность с префиксом "CID_00001" (пример):
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE)
private String id;
Есть какой-либо способ сделать это ?
вы можете использовать genericGenerator, проверьте этот stackoverflow.com/questions/47259048/…
Я думаю, вы используете последовательность базы данных для создания ПК. Поэтому добавьте триггер перед вставкой в таблицу. например, (в оракуле)
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)
Привет, Торбен, в этом -- @Parameter(name = StringPrefixedSequenceIdGenerator.INCREMENT_PARAM, value = "50") . что представляет собой значение 50 и что меняет изменение числа при генерации идентификатора?
зачем ему этот префикс?