Eine der neuen Funktionen in Hibernate 6 ist die Einführung der IdentifierGenerator-Schnittstelle. Im Standardgenerator delegiert Hibernate 6 an NULL ID als Standardimplementierung. Mit dieser neuen Funktion können Entwickler die Identitätsgenerierung für Entitäten flexibler anpassen. In diesem Artikel stellt PHP-Editor Yuzai die Verwendung und Beispiele von IdentifierGenerator in Hibernate 6 vor.
Ich habe eine spezielle Anforderung, die ID einer Entität basierend auf einer Zuordnungstabelle in einem alten System manuell festzulegen und zu speichern. Ich habe vor dem Upgrade auf Hibernate 6 eine Klasse erstellt, die diese Funktionalität implementiert.
Die Grundlage dieser Klasse besteht darin, die übergebene ID (d. h. ungleich Null) zu verwenden oder Hibernate seinen Standardmechanismus zum Generieren des Werts verwenden zu lassen.
Ich hatte eine funktionierende Version des Codes für 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; } }
und seine Verwendung
@GenericGenerator( name = "CustomIdGenerator", type = domain.util.CustomIdGenerator.class ) public class Tournament { @Id @GeneratedValue( strategy = GenerationType.IDENTITY, generator = "CustomIdGenerator" ) private Long id; }
Irgendwelche Ideen, wie man diesen Code an die Arbeit mit Hibernate 6 anpassen kann?
Ich denke, als Lösung können Sie so etwas wie die nächste Methode anwenden, da Sie die Sitzung haben.
@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; } }
Oder verwenden Sie session.createnativequery()
und extrahieren Sie den nächsten Wert der Sequenz.
Das obige ist der detaillierte Inhalt vonRuhezustand 6 – IdentifierGenerator – Standardgenerator, der an NULL-IDs delegiert. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!