Hibernate 6 - IdentifierGenerator - Générateur par défaut qui délègue aux ID NULL
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; } }
et son utilisation
@GenericGenerator( name = "CustomIdGenerator", type = domain.util.CustomIdGenerator.class ) public class Tournament { @Id @GeneratedValue( strategy = GenerationType.IDENTITY, generator = "CustomIdGenerator" ) private Long id; }
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; } }
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!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)