简体   繁体   中英

How insert values to multiple tables using spring and hibernate

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>

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>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM