Приращение строки для буквенно-цифрового поля для JPA не работает - PullRequest
0 голосов
/ 12 ноября 2018

https://vladmihalcea.com/how-to-implement-a-custom-string-based-sequence-identifier-generator-with-hibernate/

Я пытался это сделать для поля, которое не является первичным ключом.

Также то же самое решение здесь: Как реализовать IdentifierGenerator с PREFIX и отдельной последовательностью для каждой сущности

Но даже при запуске программы это не относится к методу Java. Сохраняет как ноль.

И я не вижу журнал, который я положил в свой класс. Для моего класса нет журнала.

Я скопировал из этого блога, но мой код:

public class StringSequenceIdentifier
        implements IdentifierGenerator, Configurable {

    public static final String SEQUENCE_PREFIX = "sequence_prefix";

    private String sequencePrefix;

    private String sequenceCallSyntax;

    @Override
    public void configure(
            Type type, Properties params, ServiceRegistry serviceRegistry)
            throws MappingException {
        System.out.println("xxx");
        final JdbcEnvironment jdbcEnvironment =
                serviceRegistry.getService(JdbcEnvironment.class);
        final Dialect dialect = jdbcEnvironment.getDialect();

        final ConfigurationService configurationService =
                serviceRegistry.getService(ConfigurationService.class);
        String globalEntityIdentifierPrefix =
                configurationService.getSetting( "entity.identifier.prefix", String.class, "SEQ_" );

        sequencePrefix = ConfigurationHelper.getString(
                SEQUENCE_PREFIX,
                params,
                globalEntityIdentifierPrefix);

        final String sequencePerEntitySuffix = ConfigurationHelper.getString(
                SequenceStyleGenerator.CONFIG_SEQUENCE_PER_ENTITY_SUFFIX,
                params,
                SequenceStyleGenerator.DEF_SEQUENCE_SUFFIX);

        final String defaultSequenceName = ConfigurationHelper.getBoolean(
                SequenceStyleGenerator.CONFIG_PREFER_SEQUENCE_PER_ENTITY,
                params,
                false)
                ? params.getProperty(JPA_ENTITY_NAME) + sequencePerEntitySuffix
                : SequenceStyleGenerator.DEF_SEQUENCE_NAME;

        sequenceCallSyntax = dialect.getSequenceNextValString(
                ConfigurationHelper.getString(
                        SequenceStyleGenerator.SEQUENCE_PARAM,
                        params,
                        defaultSequenceName));
    }

    @Override
    public Serializable generate(SharedSessionContractImplementor session, Object obj) {
        System.out.println("xxx");
        if (obj instanceof Identifiable) {
            Identifiable identifiable = (Identifiable) obj;
            Serializable id = identifiable.getId();
            if (id != null) {
                return id;
            }
        }
        long seqValue = ((Number) Session.class.cast(session)
                .createSQLQuery(sequenceCallSyntax)
                .uniqueResult()).longValue();

        return sequencePrefix + String.format("%011d%s", 0 ,seqValue);
    }
}

То есть в моем домене:

@GenericGenerator(
        name = "assigned-sequence",
        strategy = "xxxxxx.StringSequenceIdentifier",
        parameters = {
                @org.hibernate.annotations.Parameter(
                        name = "sequence_name", value = "hibernate_sequence"),
                @org.hibernate.annotations.Parameter(
                        name = "sequence_prefix", value = "CTC_"),
        }
)
@GeneratedValue(generator = "assigned-sequence", strategy = GenerationType.SEQUENCE)
private String referenceCode;

ЧТО Я ХОЧУ, ЧТО Мне нужно уникальное поле, которое не является первичным. Итак, я решил, что увеличение является лучшим решением, потому что в противном случае мне нужно проверять каждое созданное случайное число, если оно существует в базе данных (я также открываю предложения для этого).

Это будет около 5-6 символов и буквенно-цифровых символов.

Я хочу увеличить JPA, но, похоже, я не могу этого сделать.

1 Ответ

0 голосов
/ 12 ноября 2018

Это очень похоже на Hibernate JPA Sequence (не-Id) , но я не думаю, что это точный дубликат.Тем не менее, ответы, кажется, применимы, и они, кажется, предлагают следующие стратегии:

  1. Сделайте поле, которое должно быть сгенерировано, ссылкой на объект с единственной целью, что поле теперь становится идентификатором иможет генерироваться обычными стратегиями.https://stackoverflow.com/a/536102/66686

  2. Используйте @PrePersist, чтобы заполнить поле, прежде чем оно будет сохранено.https://stackoverflow.com/a/35888326/66686

  3. Сделайте его @Generated и сгенерируйте значение в базе данных, используя триггер или аналогичный.https://stackoverflow.com/a/283603/66686

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