Есть ли способ создать последовательность строк, используя @GeneratedValue с префиксом? - PullRequest
0 голосов
/ 09 апреля 2019

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

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

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

Ответы [ 2 ]

1 голос
/ 09 апреля 2019

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

Самый простой способ - это расширить 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;

    ...
}
1 голос
/ 09 апреля 2019

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

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 " и имя столбца id id

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