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 Réponses :
J'ai traversé le coup d'écran et je ne vois aucune valeur pour la colonne 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 façons de résoudre ce problème: - p>
Supprimez le Supprimez l'annotation Utilisez un mappage correct entre les noms de colonne dans le tableau et ceux avec le nom de membre dans 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 nom de livraison code>. p>
DelivernameName code>. p>
NON NULL code> des contraintes de la colonne de la table de la table. p> li>
@notblank code> à partir des membres de l'objet si vous n'êtes pas sûr de savoir si les données vont être vides ou non. p> li>
Classe / Entité Code> Définition. Vous pouvez utiliser
@column code> Annotation pour le faire facilement. P> LI>
ol>
@column code> annotation ou mappage via un fichier de configuration hibernate. P>
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: p>
Nom de livraison à cordes privées; -> serait mappé sur le champ Nom de livraison dans dB. P>
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». P>
S'il vous plaît ajouter un peu plus d'explication à cette réponse
Cela peut être un commentaire.
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: avec ceci: p> 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. P> P>
J'ai fait face au même problème aujourd'hui. J'ai pu résoudre ce problème. P>
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. P>
du livre p>
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. P> blockQuote>
Les clés Nom sont des champs de la commande.java p>
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; } }
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. p>
Le message n'est pas clair? null n'est pas autorisé pour la colonne "nom de livraison"; i>
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. I> Votre table a une colonne nommée
nom de livraison code> . 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 code>. Je doute que la transmission d'une carte à une carte à l'aide d'ObjectMapper tournerait comme par magie à une clé nommée
Delivername code>.
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é.