栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何使用Hibernate实现自定义字符串序列标识符生成器

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何使用Hibernate实现自定义字符串序列标识符生成器

问题是

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上获得。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/426534.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号