0
votes

Comment réparer une erreur dans SimpleJDBCinsert dans l'application de démarrage à ressort

J'apprends Spring Boot Lecture de livre Spring in Action 5. J'essaie d'insérer des données à la base de données intégrée H2.I Utilisez la méthode SimpleJDBCinsert et ExecuteanDeTurnKeyKeyKeyKey.

Voici un constructeur: P>

@Data
public class Order {

@NotBlank(message = "Name is required")
private String name;

@NotBlank(message = "Name is required")
private String street;

@NotBlank(message = "Name is required")
private String city;

@NotBlank(message = "Name is required")
private String state;

@NotBlank(message = "Name is required")
private String zip;

@CreditCardNumber(message = "Not valid cc")
private String ccNumber;

@Pattern(regexp = "^(0[1-9]|1[0-2])([\\/])([1-9][0-9])$", message = "Must be formatted MM/YY")
private String ccExpiration;

@Digits(integer = 3, fraction = 0, message = "Invalid CVV")
private String ccCVV;

private Long id;
private Date placedAt;

List<Taco> tacos = new ArrayList<>();

public void addDesign(Taco design) {
    this.tacos.add(design);
}

}


6 commentaires

Le message n'est pas clair? null n'est pas autorisé pour la colonne "nom de livraison";


Regardez la capture d'écran. Les valeurs ne sont pas nulelles


Pouvez-vous s'il vous plaît ajouter une classe de commande aussi bien en poste ..


Ajoutée. J'ai utilisé Lombok pour ça


Le Javadoc de Simplejdbcinsert dit: Tout ce que vous devez fournir est le nom de la table et une carte contenant les noms de colonne et les valeurs de colonne. Votre table a une colonne nommée nom de livraison . Y a-t-il une clé nommée comme celle de la carte que vous créez? Votre classe de commande a une propriété nommée nom . Je doute que la transmission d'une carte à une carte à l'aide d'ObjectMapper tournerait comme par magie à une clé nommée Delivername .


Merci! ObjectMapper Faites des clés dans la carte nommée comme des champs dans la classe de commande. J'ai changé SQL Schema - Les noms de champs dans la base de données sont maintenant égaux à la touche MAP. Ça a marché.


6 Réponses :


0
votes

J'ai traversé le coup d'écran et je ne vois aucune valeur pour la colonne nom de livraison .

Le problème est dû à la table dans laquelle vous exécutez l'opération d'insertion n'autorise pas les valeurs NULL pour la colonne DelivernameName .

façons de résoudre ce problème: -

  1. Supprimez le NON NULL des contraintes de la colonne de la table de la table.

  2. Supprimez l'annotation @notblank à partir des membres de l'objet si vous n'êtes pas sûr de savoir si les données vont être vides ou non.

  3. Utilisez un mappage correct entre les noms de colonne dans le tableau et ceux avec le nom de membre dans Classe / Entité Définition. Vous pouvez utiliser @column Annotation pour le faire facilement.

    Autant que je puisse comprendre à la suite de votre code et de votre capture d'écran, que le problème est dû à un mappage incorrect entre les noms de colonne et celui du membre de l'objet. Il est recommandé que, plutôt que de s'appuyer sur la cartographie automatique du codeur de démarrage à ressort, effectuez manuellement le mappage en utilisant @column annotation ou mappage via un fichier de configuration hibernate.


0 commentaires

0
votes

Le problème est avec le nom des attributs dans la classe de commande. Ceux-ci devraient refléter le nom du coloumn de la table respective. Par exemple:

Nom de livraison à cordes privées; -> serait mappé sur le champ Nom de livraison dans dB.

Le problème est apparu comme dans Schema.SQL Le champ est nommé «nom de livraison» lorsqu'il est en classe ingrédiente, l'attitbute est nommé «nom».


2 commentaires

S'il vous plaît ajouter un peu plus d'explication à cette réponse


Cela peut être un commentaire.



0
votes

Cette réponse est pour ceux qui suivent les exemples du livre "Spring in Action". Vous ne ferez pas une telle chose dans la vie réelle, mais si vous êtes un lecteur de ce livre, il est raisonnable de remplacer ceci: xxx

avec ceci: xxx

réponses précédentes mentionné le schéma modifiant qui causera des problèmes si vous suivrez des exemples des chapitres suivants ou de l'utilisation d'annotations JPA pour effectuer la cartographie, mais selon l'auteur du livre que vous ne connaissez pas à leur sujet car ils sont introduit dans les chapitres suivants. En plus, vous n'utiliserez pas la classe JDBCorderRepository à partir du chapitre suivant.


0 commentaires

1
votes

J'ai fait face au même problème aujourd'hui. J'ai pu résoudre ce problème.

Pour résoudre ce problème, allez à Schema.SQL (fichier dans lequel vous créez des tables) et supprimez la livraison des champs de Taco_order Table.

du livre

SIMPLEJDBCINSERT a quelques méthodes utiles pour exécuter l'insertion: exécuter () et exécutandreturnkey (). Tous deux acceptent une carte, où les touches de la carte correspondent aux noms de colonne dans le tableau, les données sont insérées. Les valeurs de la carte sont insérées dans ces colonnes.

Les clés Nom sont des champs de la commande.java


0 commentaires

0
votes

noms des champs dans la classe de commande doit être identique aux noms de colonnes dans le tableau Taco_Order.

@Data
public class Order {
    private Long id;

    private Date placedAt;

    @NotBlank(message = "Podanie imienia i nazwiska jest obowiazkowe")
    private String deliveryName;

    @NotBlank(message = "Podanie ulicy jest obowiÄ…zkowe")
    private String deliveryStreet;

    @NotBlank(message = "Podanie miasta jest obowiÄ…zkowe")
    private String deliveryCity;

    @NotBlank(message = "Podanie województwa jest obowiązkowe")
    private String deliveryState;

    @NotBlank(message = "Podanie kodu pocztowego jest obowiÄ…zkowe")
    private String deliveryZip;

    @CreditCardNumber(message = "To nie jest prawidłowy numer karty kredytowej")
    private String ccNumber;

    @Pattern(regexp = "^(0[1-9]|1[0-2])([\\/])([1-9][0-9])$", message = "Wartość musi być w formacie MM/RR")
    private String ccExpiration;

    @Digits(integer = 3, fraction = 0, message = "Nieprawidłowy kod CVV")
    private String ccCVV;

    public List<Taco> tacos = new ArrayList<>();

    public void addDesign(Taco design) {
        this.tacos.add(design);
    }

    public List<Taco> getTacos() {
        return tacos;
    }
}


0 commentaires

0
votes

J'ai rencontré le même problème aujourd'hui et tout ce que j'avais oublié de faire était de mettre à jour les champs du fichier Order.html au nom de livraison, de livraison, etc.


0 commentaires