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.
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 ?
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!