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



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

我试着为一个不是主键的字段这样做。

这里也有相同的解决方案:如何使用PREFIX和每个实体的单独序列实现IdentifierGenerator

但当我运行程序时,即使它也不会转到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增加这个,但似乎我做不到。

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

  1. 使要生成的字段成为对实体的引用,唯一的目的是该字段现在成为ID,并可以通过通常的策略生成。https://stackoverflow.com/a/536102/66686

  2. 在字段持久化之前,请使用@PrePersist填充该字段。https://stackoverflow.com/a/35888326/66686

  3. 将其设为@Generated,并使用触发器或类似方法在数据库中生成值。https://stackoverflow.com/a/283603/66686

最新更新