[JAVA] [Spring Data JPA] Die benutzerdefinierte ID wird zum Zeitpunkt der Registrierung in einer eindeutigen Reihenfolge zugewiesen.

Einführung

Bei der Registrierung von Daten bei "Spring Data JPA" Dies ist eine Zusammenfassung der Codes, wenn Präfixe zu den in der Sequenz zugewiesenen Nummern hinzugefügt werden.

Umgebung

Java 8 PostgreSQL 10.5

Was ich getan habe

Implementieren Sie Ihren eigenen Generator. (Person, die Präfixe)

Erbt SequenceStyleGenerator. Bei der Nummerierung in der Sequenz wird die interne Verarbeitung (Superklasse) unverändert verwendet. Der ursprüngliche Generator hat die Aufgabe, dem nummerierten ein Präfix hinzuzufügen.

Beschreiben der Generatorspezifikation und der Parameter in Entity

Geben Sie die Reihenfolge, das Präfix und das Format in Entity an. Wenn Sie keine Sequenz angeben, wird versucht, `` `hibernate_sequence``` zu verwenden. (Ich war hier ein bisschen süchtig)

Quelle

Die implementierte Quelle.

Originalgenerator

python


import java.io.Serializable;
import java.util.Properties;

import org.hibernate.HibernateException;
import org.hibernate.MappingException;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.id.enhanced.SequenceStyleGenerator;
import org.hibernate.internal.util.config.ConfigurationHelper;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.type.LongType;
import org.hibernate.type.Type;

public class PrefixedIdGenerator extends SequenceStyleGenerator {

    public static final String VALUE_PREFIX_PARAMETER = "valuePrefix";
    public static final String VALUE_PREFIX_DEFAULT = "";
    private String valuePrefix;


    public static final String NUMBER_FORMAT_PARAMETER = "numberFormat";
    public static final String NUMBER_FORMAT_DEFAULT = "%d";

    private String numberFormat;

    @Override
    public Serializable generate(SharedSessionContractImplementor session, Object object) throws HibernateException {
        return valuePrefix + String.format(numberFormat, super.generate(session, object));
    }

    @Override
    public void configure(Type type, Properties params, ServiceRegistry serviceRegistry) throws MappingException {
        super.configure(LongType.INSTANCE, params, serviceRegistry);
        valuePrefix = ConfigurationHelper.getString(VALUE_PREFIX_PARAMETER, params, VALUE_PREFIX_DEFAULT);
        numberFormat = ConfigurationHelper.getString(NUMBER_FORMAT_PARAMETER, params, NUMBER_FORMAT_DEFAULT);
    }
}

Entity

python


import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

import lombok.Data;

import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Parameter;

@Entity
@Data
@Table(name = "trial")
public class Trial {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_trial")
    @GenericGenerator(
            name = "seq_trial",
            strategy = "PrefixedIdGenerator",
            parameters = {
                @Parameter(name = PrefixedIdGenerator.SEQUENCE_PARAM, value = "seq_trial"),
                @Parameter(name = PrefixedIdGenerator.VALUE_PREFIX_PARAMETER, value = "B_"),
                @Parameter(name = PrefixedIdGenerator.NUMBER_FORMAT_PARAMETER, value = "%05d") })
    @Column(name = "trial_id")
    private String trialId;

    @Column(name = "trial_name")
    private String trialName;
}

Service

python


@Service
public class TrialService {

    @Autowired
    private TrialRepository repository;

    @Transactional
    public void insert() {

        Trial entity = new Trial();
        entity.setTrialName("trial_xxxxxxxx");

        repository.save(entity);
    }
}

Laufzeitprotokoll

2019/05/24 17:54:18.505 [http-nio-8099-exec-1] DEBUG SqlStatementLogger 92 : 
    select
        nextval ('seq_test')
2019/05/24 17:54:22.313 [http-nio-8099-exec-1] DEBUG SqlStatementLogger 92 : 
    insert 
    into
        trial
        (trial_name, trial_id) 
    values
        (?, ?)
2019/05/24 17:54:22.318 [http-nio-8099-exec-1] TRACE BasicBinder 65 : binding parameter [1] as [VARCHAR] - [trial_xxxxxxxx]
2019/05/24 17:54:22.319 [http-nio-8099-exec-1] TRACE BasicBinder 65 : binding parameter [2] as [VARCHAR] - [B_00001]

Referenzierte Site

How to Implement a Custom, Sequence-Based ID Generator

das ist alles

Recommended Posts

[Spring Data JPA] Die benutzerdefinierte ID wird zum Zeitpunkt der Registrierung in einer eindeutigen Reihenfolge zugewiesen.
Spring Data JPA: Schreiben Sie eine Abfrage in Pure SQL in @Query of Repository
So erstellen Sie eine eindeutige Datenkombination in der Schienen-Zwischentabelle
Bis zur Verwendung von Spring Data und JPA Part 2
Bis zur Verwendung von Spring Data und JPA Part 1
Machen Sie die where-Klauselvariable in Spring Data JPA
Überprüfen Sie das Verhalten von getOne-, findById- und Abfragemethoden mit Spring Boot + Spring Data JPA
[Spring Data JPA] Kann die And-Bedingung in der automatisch implementierten Löschmethode verwendet werden?
Für den Typ wurde keine Eigenschaftsliste gefunden, da es sich um eine nicht benannte Abfrage von Spring Data JPA handelt
Generieren Sie mit TableGenerator of Hibernate (JPA) eine Seriennummer und speichern Sie diese in der ID von String.
Rufen Sie in Spring Boot eine Proxy-Instanz der Komponente selbst ab
Sehen Sie sich das Verhalten von Entitätsaktualisierungen mit Spring Boot + Spring Data JPA an
[Spring Boot] Poste Dateien und andere Daten gleichzeitig [Axios]
Zum Zeitpunkt der Neuregistrierung E-Mail-Sendefunktion mit Action Mailer
So ändern Sie den Wert einer Variablen an einem Haltepunkt in IntelliJ
So implementieren Sie die E-Mail-Authentifizierungsfunktion zum Zeitpunkt der Benutzerregistrierung
Die Geschichte der Begegnung mit Spring Custom Annotation
Die Identität der Schienenparameter [: id]
Existiert mit der Spezifikation in Spring Data JPA
Wie ist die Datenstruktur von ActionText?
So erhalten Sie die ID eines Benutzers, der sich in Swift bei Firebase authentifiziert hat
Melden Sie sich bei Spring Boot-Webanwendungen auf der Microsoft ID-Plattform an
Rufen Sie den in der Controller-Klasse von Spring Boot definierten Pfad als Liste ab
Jackson kann hibernateLazyInitializer in Spring Data nicht JSON serialisieren JPA führt zu einem Fehler
Auch wenn ich den Inhalt eines Datenobjekts in Java in JSON konvertieren möchte, gibt es einen Zirkelverweis ...
Wenn eine Nachricht mit dem benutzerdefinierten Validator von JSF angezeigt wird, wird die errorClass von h: message nur angewendet, wenn SEVERITY_ERROR in der Nachricht festgelegt ist.