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

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

WBOY
Freigeben: 2024-02-14 20:48:07
nach vorne
517 Leute haben es durchsucht

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;
    }
    
}
Nach dem Login kopieren

und seine Verwendung

@GenericGenerator( name = "CustomIdGenerator",
                   type = domain.util.CustomIdGenerator.class )
public class Tournament
{
    @Id
    @GeneratedValue( strategy = GenerationType.IDENTITY, generator = "CustomIdGenerator" )
    private Long id;
}
Nach dem Login kopieren

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;
  }
}
Nach dem Login kopieren

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!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage