0

I've a tables in database:

  1. UserRoles (dictionary)

    • Id
    • Name (Admin, user...)
  2. UsersLogins

    • Id
    • email
    • password
  3. UserProfiles

    • Id
    • FirstName
    • LastName
  4. Users

    • Id
    • IdUserLogin (FK)
    • IdUserRole (FK)
    • IdUserProfile (FK)

How Can I insert values to above three tables?

I tried something like this:

Controller:

@Autowired
private UserProfilesService userProfilesService;
@Autowired
private D_UserRolesService d_UserRolesService;
@Autowired
private UserLoginsService loginsService;
@Autowired
private UsersService usersService;

@RequestMapping(value = "/add", method = RequestMethod.GET)
public String getAddNewUserForm(Model model) {
    UserProfiles userProfiles = new UserProfiles();
    UserLogins userLogins = new UserLogins();
    Users users = new Users();
    model.addAttribute("userProfiles", userProfiles);
    model.addAttribute("users", users);
    model.addAttribute("userLogin", userLogins);
    model.addAttribute("userRoless", d_UserRolesService.getAllRoles());
    return "userNew";
}

@RequestMapping(value = "/add", method = RequestMethod.POST)
public String processAddNewUserForm(@ModelAttribute("userProfiles") UserProfiles profileToBeAdded,
        @ModelAttribute("userLogin") UserLogins loginToBeAdded, @ModelAttribute("users") Users userToBeAdded,
        HttpServletRequest request) {
    userProfilesService.addUser(profileToBeAdded);
    loginsService.AddOrUpdateUser(loginToBeAdded);
    usersService.AddOrUpdateUser(userToBeAdded);

    return "redirect:/users";
}

JSP PAGE:

<form:form class="form-horizontal" >
                <fieldset>
                    <legend>New user</legend>
                    <!-- Login -->
                    <form:form modelAttribute="userLogin">
                        <form:hidden path="idLogin"/>
                        <div class="form-group">
                            <label class="control-label col-lg-2" for="Email">E-mail</label>
                            <div class="col-lg-10">
                                <form:input id="Email" path="Email" type="text" class="form:input-large"/>
                            </div>
                        </div>                   
                        <div class="form-group">
                            <label class="control-label col-lg-2" for="Password">Password</label>
                            <div class="col-lg-10">
                                <form:password id="Password" path="Password" class="form:input-large"/>
                            </div>
                        </div>    
                    </form:form>
                    <!-- Profile --> 
                    <form:form modelAttribute="userProfiles">
                        <form:hidden path="id"/>
                        <div class="form-group">
                            <label class="control-label col-lg-2" for="FirstName">FirstName</label>
                            <div class="col-lg-10">
                                <form:input id="FirstName" path="FirstName" type="text" class="form:input-large"/>
                            </div>
                        </div>
                        <div class="form-group">
                            <label class="control-label col-lg-2" for="LastName">LastName</label>
                            <div class="col-lg-10">
                                <form:input id="LastName" path="LastName" type="text" class="form:input-large"/>
                            </div>
                        </div>
                    </form:form>
                    <!-- Users -->  
                    <form:form modelAttribute="users">
                        <form:hidden path="idUser"/>
                        <div class="form-group">
                            <label class="control-label col-lg-2" for="idUserRole">Role</label>
                            <div class="col-lg-10">
                                <form:select path="userRole" items="${userRoless}"
                                             itemValue="IdUserRole" itemLabel="name" multiple="false"
                                             class="span12">
                                </form:select>
                            </div>
                            <div class="form-group">
                                <label class="control-label col-lg-2" for="IdLogin">Id</label>
                                <div class="col-lg-10">
                                    <form:input id="userLogin" path="userLogin" type="text" class="form:input-large"/>
                                </div>
                            </div>
                            <div class="form-group">
                                <label class="control-label col-lg-2" for="IdLogin">Id</label>
                                <div class="col-lg-10">
                                    <form:input id="userProfile" path="userProfile" type="text" class="form:input-large"/>
                                </div>
                            </div>
                        </div>
                    </form:form>

                    <div class="form-group">
                        <div class="col-lg-offset-2 col-lg-10">
                            <input type="submit" id="btnAdd" class="btn btn-primary" value ="Add"/>
                        </div>
                    </div>      

                </fieldset>
            </form:form>
Pablo
  • 173
  • 1
  • 3
  • 14
  • 1
    So what problem you are facing? any exception or are you not getting what to write in service class? – Amogh Jul 29 '15 at 21:01
  • 1. How can i get attributes in method POST when i've a few forms? Now i don't get any attribute. 2. How insert values to table Users? I need last insert ID or what? – Pablo Jul 29 '15 at 21:05
  • In view you have to take on one `` and instade of multiple modelAttribute by using view model concept or by using models you have to take only one modelAttribute in POST method and in service you save respected models individually or you can use cascade option. [This](http://stackoverflow.com/questions/15480397/how-to-send-list-of-objects-to-view-and-back-to-post-method-in-controller) will help to learn how to send model attribute to POST – Amogh Jul 29 '15 at 21:14

1 Answers1

1

Note: It would be very helpful if you added the java classes representing each table to your question.

You should add the metadata describing how your tables are related to your classes (pojos), and setting the CascadeType to Persist or ALL for example:

@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
@JoinColumn(name = "user_roles", referencedColumnName = "id")
private UserRoles userRole;


@OneToOne(cascade = CascadeType.ALL, optional = false, fetch = FetchType.EAGER, orphanRemoval =
        true)
@JoinColumn(name = "id_user_login", referencedColumnName = "id")
private UserLogin userLogin;

@OneToOne(cascade = CascadeType.ALL, optional = false, fetch = FetchType.EAGER, orphanRemoval =
        true)
@JoinColumn(name = "id_user_profile", referencedColumnName = "id")
private UserProfile userProfile;

Then you can set the respective values of the child class/table and insert the parent class/table:

Users user = new Users();
UserProfile myUserProfile = new UserProfile();
UserLogin myUserLogin = new UserLogin();
UserRole myUserRole = new UserRole();
//... set the values ...
//then:
user.setUserProfile(myUserProfile);
user.setUserLogin(myUserLogin);
user.setUserRole(myUserRole);

[EDIT]

I am not sure how you persist your objects, but I assume you do so in your services (userProfilesService, etc).

You could place what I wrote above in one of your following methods: 1.

@RequestMapping(value = "/add", method = RequestMethod.GET)
public String getAddNewUserForm(Model model) {
    UserProfiles userProfiles = new UserProfiles();
    UserLogins userLogins = new UserLogins();
    Users users = new Users();
    //Here
    users.setUserProfile(userProfiles);
    users.setUserLogins(userLogins);
    userLogins.setUsers(users);
    userProfiles.setUsers(users);

    model.addAttribute("userProfiles", userProfiles);
    model.addAttribute("users", users);
    model.addAttribute("userLogin", userLogins);
    model.addAttribute("userRoless", d_UserRolesService.getAllRoles());
    return "userNew";
}

2. Or

@RequestMapping(value = "/add", method = RequestMethod.POST)
public String processAddNewUserForm(@ModelAttribute("userProfiles") UserProfiles profileToBeAdded,
        @ModelAttribute("userLogin") UserLogins loginToBeAdded, @ModelAttribute("users") Users userToBeAdded,
        HttpServletRequest request) {
    //Or here
    userToBeAdded.setUserProfile(profileToBeAdded);
    userToBeAdded.setUserLogins(loginToBeAdded);
    loginToBeAdded.setUsers(userToBeAdded);
    profileToBeAdded.setUsers(userToBeAdded);

    userProfilesService.addUser(profileToBeAdded);
    loginsService.AddOrUpdateUser(loginToBeAdded);
    usersService.AddOrUpdateUser(userToBeAdded);

    return "redirect:/users";
}

[Edit 2]

As @Amogh pointed out, you also have problems in your view. As far as I know, even in JSP/JSF you should have something like the folling:

Please note: I don't know Spring and haven't used JSP/JSF in a very long time, so this might not be totally accurate or the most efficient way to do this.

<form:form class="form-horizontal"  modelAttribute="users">
    <fieldset>

        <legend>New user</legend>
        <!-- Login -->
        <form:hidden path="idLogin"/>
        <div class="form-group">
            <label class="control-label col-lg-2" for="Email">E-mail</label>
            <div class="col-lg-10">
                <form:input id="Email" path="users.userLogin.email" type="text" class="form:input-large"/>
            </div>
        </div>
        <div class="form-group">
            <label class="control-label col-lg-2" for="Password">Password</label>
            <div class="col-lg-10">
                <form:password id="Password" path="users.userLogin.password" class="form:input-large"/>
            </div>
        </div>
    </fieldset>
    <fieldset>
        <!-- Profile -->
        <form:hidden path="id"/>
        <div class="form-group">
            <label class="control-label col-lg-2" for="FirstName">FirstName</label>
            <div class="col-lg-10">
                <form:input id="FirstName" path="users.userProfile.firstName" type="text" class="form:input-large"/>
            </div>
        </div>
        <div class="form-group">
            <label class="control-label col-lg-2" for="LastName">LastName</label>
            <div class="col-lg-10">
                <form:input id="LastName" path="users.userProfile.lastName" type="text" class="form:input-large"/>
            </div>
        </div>

        <div class="form-group">
            <div class="col-lg-offset-2 col-lg-10">
                <input type="submit" id="btnAdd" class="btn btn-primary" value ="Add"/>
            </div>
        </div>

    </fieldset>
</form:form>
Francisco C.
  • 687
  • 10
  • 14