问题是
SequenceStyleGenerator期望返回一个数字值,而不是a
String。
我已经尝试过解决此问题的方法,它就像一个魅力。因此,您需要像这样更改生成器:
public class StringSequenceIdentifier implements IdentifierGenerator, Configurable { private String sequenceCallSyntax; @Override public void configure(Type type, Properties params, ServiceRegistry serviceRegistry) throws MappingException { final JdbcEnvironment jdbcEnvironment = serviceRegistry.getService(JdbcEnvironment.class); final Dialect dialect = jdbcEnvironment.getDialect(); final String sequencePerEntitySuffix = ConfigurationHelper.getString(CONFIG_SEQUENCE_PER_ENTITY_SUFFIX, params, DEF_SEQUENCE_SUFFIX); final String defaultSequenceName = ConfigurationHelper.getBoolean(CONFIG_PREFER_SEQUENCE_PER_ENTITY, params, false) ? params.getProperty(JPA_ENTITY_NAME) + sequencePerEntitySuffix : DEF_SEQUENCE_NAME; sequenceCallSyntax = dialect.getSequenceNextValString(ConfigurationHelper.getString(SEQUENCE_PARAM, params, defaultSequenceName)); } @Override public Serializable generate(SessionImplementor session, Object obj) { 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 "CTC" + seqValue; }}您的映射将变为:
@Entity(name = "Post")@Table(name = "post")public static class Post implements Identifiable<String> { @Id @GenericGenerator( name = "assigned-sequence", strategy = "com.vladmihalcea.book.hpjp.hibernate.identifier.StringSequenceIdentifier", parameters = @org.hibernate.annotations.Parameter(name = "sequence_name", value = "hibernate_sequence") ) @GeneratedValue(generator = "assigned-sequence", strategy = GenerationType.SEQUENCE) private String id; @Version private Integer version; public Post() { } public Post(String id) { this.id = id; } @Override public String getId() { return id; }}现在,当您插入以下实体时:
doInJPA(entityManager -> { entityManager.persist(new Post()); entityManager.persist(new Post("ABC")); entityManager.persist(new Post()); entityManager.persist(new Post("DEF"));});Hibernate生成正确的标识符:
Query:["select nextval ('hibernate_sequence')"], Params:[()]Query:["select nextval ('hibernate_sequence')"], Params:[()]Query:["insert into post (version, id) values (?, ?)"], Params:[(0, CTC1)]Query:["insert into post (version, id) values (?, ?)"], Params:[(0, ABC)]Query:["insert into post (version, id) values (?, ?)"], Params:[(0, CTC2)]Query:["insert into post (version, id) values (?, ?)"], Params:[(0, DEF)]代码可在GitHub上获得。



