[JAVA] [Spring Data JPA] L'ID personnalisé est attribué dans une séquence unique au moment de l'enregistrement.

introduction

Lors de l'enregistrement de données avec "Spring Data JPA" Ceci est un résumé des codes lorsque des préfixes sont ajoutés aux numéros attribués dans la séquence.

environnement

Java 8 PostgreSQL 10.5

Ce que j'ai fait

Implémentez votre propre générateur. (Personne qui préfixe)

Hérite de SequenceStyleGenerator. La numérotation dans la séquence utilise le traitement interne (super classe) tel quel. Le générateur d'origine est le rôle d'ajouter un préfixe au numéro numéroté.

Décrire la spécification et les paramètres du générateur dans Entity

Spécifiez la séquence, le préfixe et le format dans Entité. Si vous ne spécifiez pas de séquence, il essaiera d'utiliser hibernate_sequence```. (J'étais un peu accro ici)

La source

La source implémentée.

Générateur d'origine

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);
    }
}

Journal d'exécution

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]

Site référencé

How to Implement a Custom, Sequence-Based ID Generator

c'est tout

Recommended Posts

[Spring Data JPA] L'ID personnalisé est attribué dans une séquence unique au moment de l'enregistrement.
Spring Data JPA: écrivez une requête en Pure SQL dans @Query of Repository
Comment créer une combinaison unique de données dans la table intermédiaire des rails
Jusqu'à l'utilisation de Spring Data et JPA Part 2
Jusqu'à l'utilisation de Spring Data et JPA Part 1
Créer la variable de clause where dans Spring Data JPA
Vérifiez le comportement de getOne, findById et des méthodes de requête avec Spring Boot + Spring Data JPA
[Spring Data JPA] La condition And peut-elle être utilisée dans la méthode de suppression implémentée automatiquement?
Aucune liste de propriétés trouvée pour le type car il s'agit d'une requête non nommée de Spring Data JPA
Générez un numéro de série avec TableGenerator of Hibernate (JPA) et stockez-le dans l'ID de String.
Obtenez une instance proxy du composant lui-même dans Spring Boot
Voir le comportement des mises à jour d'entités avec Spring Boot + Spring Data JPA
[Spring Boot] Publiez des fichiers et d'autres données en même temps [Axios]
Au moment de la nouvelle inscription, fonction d'envoi de courrier avec Action Mailer
Comment changer la valeur d'une variable à un point d'arrêt dans intelliJ
Comment mettre en œuvre la fonction d'authentification du courrier au moment de l'inscription de l'utilisateur
L'histoire de la rencontre avec l'annotation personnalisée Spring
L'identité des paramètres de rails [: id]
Existe en utilisant la spécification dans Spring Data JPA
Quelle est la structure des données d'ActionText?
Comment obtenir l'ID d'un utilisateur qui s'est authentifié avec Firebase dans Swift
Connectez-vous aux applications Web Spring Boot sur la plate-forme Microsoft ID
Obtenez le chemin défini dans la classe Controller de Spring Boot sous forme de liste
Jackson ne peut pas sérialiser JSON hibernateLazyInitializer dans Spring Data JPA entraîne une erreur
Même si je souhaite convertir le contenu d'un objet de données en JSON en Java, il existe une référence circulaire ...
Lors de l'affichage d'un message avec le validateur personnalisé de JSF, la classe d'erreur de h: message n'est pas appliquée à moins que SEVERITY_ERROR ne soit défini dans le message.