Hibernate 6中的新特性之一是IdentifierGenerator接口的引入。在默认生成器中,Hibernate 6将委托给NULL ID作为默认实现。通过这个新特性,开发人员可以更灵活地自定义实体的标识生成。本文将由php小编鱼仔介绍Hibernate 6中IdentifierGenerator的使用方法和示例。
我有一个特定要求,即根据旧系统中的映射表手动设置和保存实体的 id。我在升级到 hibernate 6 之前创建了一个实现此功能的类。
该类的基础是使用已传递的 id(即非空)或“让”hibernate 使用其默认机制来生成值。
我有一个适用于 hibernate < 6 的代码工作版本,现在需要升级,下面的代码不再适用。
@slf4j public class customidgenerator implements identifiergenerator { @override public serializable generate( final sharedsessioncontractimplementor session, final object obj ) { serializable id = session.getentitypersister( null, obj ).getclassmetadata().getidentifier( obj, session ); if ( id == null || long.parselong( id.tostring() ) <= 0 ) { // if the id is not set or is less than or equal to 0, let hibernate generate it. log.debug( "hibernate will generate a new id for entity [{}]", obj.getclass().getname() ); id = super.generate( session, obj ); // cannot do this anymore! } else { log.debug( "using provided id [{}] for entity [{}]", id, obj.getclass().getname() ); } return id; } }
及其用法
@GenericGenerator( name = "CustomIdGenerator", type = domain.util.CustomIdGenerator.class ) public class Tournament { @Id @GeneratedValue( strategy = GenerationType.IDENTITY, generator = "CustomIdGenerator" ) private Long id; }
关于如何调整此代码以与 hibernate 6 配合使用有什么想法吗?
我想作为解决方案,您可以执行类似下一种方法的操作,因为您有会话。
@Slf4j public class CustomIdentifierGenerator implements IdentifierGenerator { @Override public Serializable generate(SharedSessionContractImplementor session, Object obj) { Serializable id = session.getEntityPersister( null, obj ).getClassMetadata().getIdentifier( obj, session ); if (id == null || Long.parseLong(id.toString()) <= 0) { // If the ID is not set or is less than or equal to 0, let Hibernate generate it. log.debug("Hibernate will generate a new ID for entity [{}]", obj.getClass().getName()); String sqlQuery = "SELECT MAX(id) FROM Tournament"; Optional<Long> query = session.createQuery(sqlQuery, Long.class).getResultStream().findFirst(); id = query.get() + 1; } else { log.debug("Using provided ID [{}] for entity [{}]", id, obj.getClass().getName()); } return id; } }
或者使用 session.createnativequery()
并提取序列的下一个值。
以上是Hibernate 6 - IdentifierGenerator - 委托给 NULL ID 的默认生成器的详细内容。更多信息请关注PHP中文网其他相关文章!