Java 字母数字字段的字符串增量用于JPA不工作

Java 字母数字字段的字符串增量用于JPA不工作,java,spring-data-jpa,Java,Spring Data Jpa,我试图为一个不是主键的字段设置此字段 这里也有相同的解决方案: 但当我运行程序时,即使它也不会转到Java方法。它保存为null 我看不到我放在课堂上的日志。我的课没有日志 我从那个博客上复制了,但我的代码是: public class StringSequenceIdentifier implements IdentifierGenerator, Configurable { public static final String SEQUENCE_PREFIX =

我试图为一个不是主键的字段设置此字段

这里也有相同的解决方案:

但当我运行程序时,即使它也不会转到Java方法。它保存为null

我看不到我放在课堂上的日志。我的课没有日志

我从那个博客上复制了,但我的代码是:

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增加这个,但似乎我做不到。

这与非常相似,但我不认为它是完全重复的。然而,答案似乎是适用的,它们似乎提出了以下策略:

  • 将要生成的字段作为对实体的引用,其唯一目的是该字段现在成为ID,并且可以通过常规策略生成

  • 使用
    @PrePersist
    在字段持久化之前填充该字段

  • 使其
    @Generated
    并使用触发器或类似工具在数据库中生成值


  • 步骤3建议从2008年开始使用xml和xml。还有其他方法吗?在对该答案的评论中,
    @Generated
    作为基于注释的等价物给出。但无法理解3。解决方案我怎样才能添加前缀呢