如何使用spring和hibernate将值插入到多个表中 [英] How insert values to multiple tables using spring and hibernate

查看:139
本文介绍了如何使用spring和hibernate将值插入到多个表中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在数据库中有一张表:


  1. UserRoles(字典)


    • ID

    • 名称(管理员,用户...)

  2. UsersLogins


    • ID

    • 电子邮件

    • 密码

  3. UserProfiles

      $
      $ b $ li $姓名
    • b
    • 用户


      • Id

      • IdUserLogin(FK)
      • IdUserRole(FK)

      • IdUserProfile(FK)



      • 如何将值插入到三个以上的表中?



        我试过这样的事情:

        控制器:

          @Autowired 
        private UserProfilesService userProfilesService;
        @Autowired
        private D_UserRolesService d_UserRolesService;
        @Autowired
        私人UserLoginsService loginsService;
        @Autowired
        私人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());
        返回userNew;

        $ b @RequestMapping(value =/ add,method = RequestMethod.POST)
        public String processAddNewUserForm(@ModelAttribute(userProfiles)UserProfiles profileToBeAdded,
        @ModelAttribute(userLogin)UserLogins loginToBeAdded,@ModelAttribute(users)用户userToBeAdded,
        HttpServletRequest请求){
        userProfilesService.addUser(profileToBeAdded);
        loginsService.AddOrUpdateUser(loginToBeAdded);
        usersService.AddOrUpdateUser(userToBeAdded);

        返回redirect:/ users;
        }

        JSP PAGE:

         < form:form class =form-horizo​​ntal> 
        < fieldset>
        < legend>新用户< / legend>
        <! - 登入 - >
        < form:form modelAttribute =userLogin>
        < form:hidden path =idLogin/>
        < div class =form-group>
        < label class =control-label col-lg-2for =电子邮件>电子邮件< / label>
        < div class =col-lg-10>
        < form:input id =Emailpath =Emailtype =textclass =form:input-large/>
        < / div>
        < / div>
        < div class =form-group>
        < label class =control-label col-lg-2for =密码>密码< / label>
        < div class =col-lg-10>
        < form:password id =Passwordpath =Passwordclass =form:input-large/>
        < / div>
        < / div>
        < / form:form>
        <! - 个人资料 - >
        < form:form modelAttribute =userProfiles>
        < form:hidden path =id/>
        < div class =form-group>
        < label class =control-label col-lg-2for =FirstName> FirstName< / label>
        < div class =col-lg-10>
        < form:input id =FirstNamepath =FirstNametype =textclass =form:input-large/>
        < / div>
        < / div>
        < div class =form-group>
        < label class =control-label col-lg-2for =LastName> LastName< / label>
        < div class =col-lg-10>
        < form:input id =LastNamepath =LastNametype =textclass =form:input-large/>
        < / div>
        < / div>
        < / form:form>
        <! - 用户 - >
        < form:form modelAttribute =users>
        < form:hidden path =idUser/>
        < div class =form-group>
        < label class =control-label col-lg-2for =idUserRole>角色< / label>
        < div class =col-lg-10>
        < form:select path =userRoleitems =$ {userRoless}
        itemValue =IdUserRoleitemLabel =namemultiple =false
        class =span12 >
        < / form:select>
        < / div>
        < div class =form-group>
        < label class =control-label col-lg-2for =IdLogin> Id< / label>
        < div class =col-lg-10>
        < form:input id =userLoginpath =userLogintype =textclass =form:input-large/>
        < / div>
        < / div>
        < div class =form-group>
        < label class =control-label col-lg-2for =IdLogin> Id< / label>
        < div class =col-lg-10>
        < form:input id =userProfilepath =userProfiletype =textclass =form:input-large/>
        < / div>
        < / div>
        < / div>
        < / form:form>

        < div class =form-group>
        < div class =col-lg-offset-2 col-lg-10>
        < input type =submitid =btnAddclass =btn btn-primaryvalue =Add/>
        < / div>
        < / div>

        < / fieldset>
        < / form:form>


        解决方案

        注意: java类代表你的问题每个表。

        您应该添加描述您的表与您的类(pojos)相关的元数据,并设置 CascadeType 持久所有例如:

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


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

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

        然后,您可以设置子类/表的相应值并插入父类/表:

          Users user = new Users(); 
        UserProfile myUserProfile = new UserProfile();
        UserLogin myUserLogin = new UserLogin();
        UserRole myUserRole = new UserRole();
        // ...设置值...
        //然后:
        user.setUserProfile(myUserProfile);
        user.setUserLogin(myUserLogin);
        user.setUserRole(myUserRole);



        我不是确定你如何坚持你的对象,但我假设你在
        服务( userProfilesService 等)中这样做。



        您可以将我在上面写的内容放在您的以下某个方法中:
        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());
        返回userNew;
        }

        2。或

        $ $ p $ $ $ c $ @ $ @ $ @ $ @ $ @ $ @ $ @ $ @ $ @ $ @ $ @ $ @ $ public String processAddNewUserForm(@ ModelAttribute(userProfiles)UserProfiles profileToBeAdded,
        @ModelAttribute(userLogin)UserLogins loginToBeAdded,@ModelAttribute(users)用户userToBeAdded,
        HttpServletRequest请求){
        // Or here
        userToBeAdded.setUserProfile(profileToBeAdded);
        userToBeAdded.setUserLogins(loginToBeAdded);
        loginToBeAdded.setUsers(userToBeAdded);
        profileToBeAdded.setUsers(userToBeAdded);

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

        返回redirect:/ users;
        }



        正如@Amogh指出的那样,你认为你也有问题。据我所知,即使在JSP / JSF中,你也应该有类似于folling:

        请注意:我不知道Spring并且没有使用JSP / JSF在很长一段时间,所以这可能不是完全准确或最有效的方式来做到这一点。

         < form:form class =form-horizo​​ntalmodelAttribute =users> 
        < fieldset>

        < legend>新用户< / legend>
        <! - 登入 - >
        < form:hidden path =idLogin/>
        < div class =form-group>
        < label class =control-label col-lg-2for =电子邮件>电子邮件< / label>
        < div class =col-lg-10>
        < form:input id =Emailpath =users.userLogin.emailtype =textclass =form:input-large/>
        < / div>
        < / div>
        < div class =form-group>
        < label class =control-label col-lg-2for =密码>密码< / label>
        < div class =col-lg-10>
        < form:password id =Passwordpath =users.userLogin.passwordclass =form:input-large/>
        < / div>
        < / div>
        < / fieldset>
        < fieldset>
        <! - 个人资料 - >
        < form:hidden path =id/>
        < div class =form-group>
        < label class =control-label col-lg-2for =FirstName> FirstName< / label>
        < div class =col-lg-10>
        < form:input id =FirstNamepath =users.userProfile.firstNametype =textclass =form:input-large/>
        < / div>
        < / div>
        < div class =form-group>
        < label class =control-label col-lg-2for =LastName> LastName< / label>
        < div class =col-lg-10>
        < form:input id =LastNamepath =users.userProfile.lastNametype =textclass =form:input-large/>
        < / div>
        < / div>

        < div class =form-group>
        < div class =col-lg-offset-2 col-lg-10>
        < input type =submitid =btnAddclass =btn btn-primaryvalue =Add/>
        < / div>
        < / div>

        < / fieldset>
        < / form:form>


        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>
        

        这篇关于如何使用spring和hibernate将值插入到多个表中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆