首页  >  文章  >  Hibernate 6 - IdentifierGenerator - 委托给 NULL ID 的默认生成器

Hibernate 6 - IdentifierGenerator - 委托给 NULL ID 的默认生成器

WBOY
WBOY转载
2024-02-14 20:48:07409浏览

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中文网其他相关文章!

声明:
本文转载于:stackoverflow.com。如有侵权,请联系admin@php.cn删除