Maison > Java > Hibernate 6 - IdentifierGenerator - Générateur par défaut qui délègue aux ID NULL

Hibernate 6 - IdentifierGenerator - Générateur par défaut qui délègue aux ID NULL

WBOY
Libérer: 2024-02-14 20:48:07
avant
517 Les gens l'ont consulté

L'une des nouvelles fonctionnalités d'Hibernate 6 est l'introduction de l'interface IdentifierGenerator. Dans le générateur par défaut, Hibernate 6 déléguera à NULL ID comme implémentation par défaut. Grâce à cette nouvelle fonctionnalité, les développeurs peuvent personnaliser de manière plus flexible la génération d'identité pour les entités. Dans cet article, l'éditeur PHP Yuzai présentera l'utilisation et des exemples d'IdentifierGenerator dans Hibernate 6.

Contenu de la question

J'ai une exigence spécifique pour définir et enregistrer manuellement l'identifiant d'une entité basée sur une table de mappage dans un ancien système. J'ai créé une classe qui implémente cette fonctionnalité avant de passer à Hibernate 6.

La base de cette classe est d'utiliser l'identifiant transmis (c'est-à-dire non nul) ou de "laisser" hiberner utiliser son mécanisme par défaut pour générer la valeur.

J'avais une version fonctionnelle du code pour hibernate

@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;
    }
    
}
Copier après la connexion

et son utilisation

@GenericGenerator( name = "CustomIdGenerator",
                   type = domain.util.CustomIdGenerator.class )
public class Tournament
{
    @Id
    @GeneratedValue( strategy = GenerationType.IDENTITY, generator = "CustomIdGenerator" )
    private Long id;
}
Copier après la connexion

Des idées sur la façon d'adapter ce code pour qu'il fonctionne avec hibernate 6 ?

Solution de contournement

Je suppose que comme solution, vous pouvez faire quelque chose comme la méthode suivante puisque vous avez la session.

@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;
  }
}
Copier après la connexion

Ou utilisez session.createnativequery() et extrayez la valeur suivante de la séquence.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal