Heim  >  Artikel  >  Ruhezustand 6 – IdentifierGenerator – Standardgenerator, der an NULL-IDs delegiert

Ruhezustand 6 – IdentifierGenerator – Standardgenerator, der an NULL-IDs delegiert

WBOY
WBOYnach vorne
2024-02-14 20:48:07411Durchsuche

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.

Frageninhalt

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?

Workaround

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen