2017-10-03 2 views
1

Je travaille avec une application de démarrage de printemps et c'est la classe d'entité je travaille,Créer et persister correctement dans la base de données MySQL

@Entity 
public class User { 

    // form:hidden - hidden value 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 

    // form:input - textbox 
    @Column(name = "name", columnDefinition = "VARCHAR(30)", nullable = false) 
    String name; 

    // form:input - textbox 
    @Column(name = "email", columnDefinition = "VARCHAR(50)", nullable = false) 
    String email; 

    // form:input - password 
    @Column(name = "password", columnDefinition = "VARCHAR(20)", nullable = false) 
    String password; 

    // form:textarea - textarea 
    @Column(name = "address", columnDefinition = "VARCHAR(255)") 
    String address; 

    // form:input - password 
    String confirmPassword; 

    // form:checkbox - single checkbox 
    @Column(name = "newsletter") 
    boolean newsletter; 

    // form:radiobutton - radio button 
    @Column(name = "sex", columnDefinition = "VARCHAR(1)") 
    String sex; 

    // form:radiobuttons - radio button 
    @Column(name = "number") 
    Integer number; 

    // form:select - form:option - dropdown - single select 
    @Column(name = "country", columnDefinition = "VARCHAR(10)") 
    String country; 

    // form:checkboxes - multiple checkboxes 
    @ElementCollection 
    @NotNull 
    List<String> framework; 

    // form:select - multiple=true - dropdown - multiple select 
    @ElementCollection 
    List<String> skill; 
} 

Je compte créer uniquement les colonnes suivantes dans le tableau user,

id, 
    name, 
    email, 
    address, 
    password, 
    newsletter, 
    framework, 
    sex, 
    Number, 
    Country, 
    Skill 

Par exemple, le SQL correspondant sera comme (bien que je ne veux pas écrire explicitement),

CREATE TABLE user (

    id LONG GENERATED BY DEFAULT AS IDENTITY(START WITH 1, INCREMENT BY 1) PRIMARY KEY, 
    name VARCHAR(30), 
    email VARCHAR(50), 
    address VARCHAR(255), 
    password VARCHAR(20), 
    newsletter BOOLEAN, 
    framework VARCHAR(500), 
    sex VARCHAR(1), 
    Number INTEGER, 
    Country VARCHAR(10), 
    Skill VARCHAR(500) 
); 

La classe contrôleur à partir,

@Controller 
public class UserController { 

    private final Logger logger = LoggerFactory.getLogger(UserController.class); 

    @Autowired 
    private UserService userService; 


    private static List<User> populateDefaultUserValues() { 

     List<User> users = new ArrayList<>(); 

     User user = new User(); 
     user.setName("Ella"); 
     user.setEmail("[email protected]"); 
     user.setPassword("df32d343H"); 
     user.setFramework(Arrays.asList("Spring MVC, GWT".split("\\s*,\\s*"))); 
     users.add(user); 


     user = new User(); 
     user.setName("Alex"); 
     user.setEmail("[email protected]"); 
     user.setPassword("12HH2d343H"); 
     user.setFramework(Arrays.asList("Spring MVC, GWT".split("\\s*,\\s*"))); 
     users.add(user); 


     user = new User(); 
     user.setName("Romanna"); 
     user.setEmail("[email protected]"); 
     user.setPassword("Rommann343"); 
     user.setFramework(Arrays.asList("Spring MVC, GWT".split("\\s*,\\s*"))); 
     users.add(user); 

     return users; 
    } 

    @GetMapping(value = "/") 
    public String index() { 
     return "redirect:/users"; 
    } 

    @GetMapping(value = "/users") 
    public String showAllUsers(Model model) { 

     List<User> users = populateDefaultUserValues(); 

     users.forEach(user -> { 
      userService.save(user); 
     }); 

     model.addAttribute("users", userService.findAll()); 
     return "list"; 
    } 
} 

Quand je lance l'application, je vois que cela a créé dans la base de données MYSQL,

enter image description here

Comment puis-je omettez le champ confirmed_password et ajoutez les colonnes de skill et framework? Je m'attends à ce qu'ils soient VARCHAR?

Répondre

2

Comment puis-je omettez le champ confirmed_password

Vous devez utiliser l'annotation @Transient.

ajouter les colonnes de compétences et de cadre?

Puisque vous les avez marqué comme @ElementCollection - il n'y aura pas de colonnes dans user table, comme vous ne pouvez pas conserver un ensemble de valeurs dans un seul attribut de relation (il serait contraire à 1NF restrictions). Il y a deux tables supplémentaires, nommées comme user_framework et user_skill, ils sont liés à user table avec user_id colonnes.

Vous pouvez lire le Java Persistense wiki et le Hibernate documentation sur les collections pour trouver différents exemples d'utilisation appropriée. Bien que votre code soit correct, vous ne devriez pas vous inquiéter des tables de bases de données, des relations et de la cohérence des données - ORM framework (Hibernate, par défaut) gérera toutes ces choses pour vous.

+0

Si vous le savez, cela vous dérangerait d'écrire peu quelle est la bonne façon de travailler avec 'Collection' dans les classes' @ Entity'? Et, oui, j'ai 2 autres tables dans le 'MySQL', j'ai besoin de savoir que leurs valeurs sont toujours dans la partie de l'entité' User' – Arefe

+0

J'ai étendu ma réponse avec quelques liens et une petite explication sur ces tables de collection. –

+0

Ce casse dans le fichier JSP correspondant ' < c: out value = "$ {} user.name" /> ' J'obtiens l'erreur' dit causée par: javax.el.PropertyNotFoundException: La propriété [id] est introuvable sur le type [java.lang.Chaîne] ' – Arefe