如何使用spring和hibernate将值插入到多个表中

编程入门 行业动态 更新时间:2024-10-18 02:28:24
本文介绍了如何使用spring和hibernate将值插入到多个表中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我在数据库中有一张表:

  • UserRoles(字典)

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

    • ID
    • 电子邮件
    • 密码
  • 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。

         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:

      • UserRoles (dictionary)

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

        • Id
        • email
        • password
      • UserProfiles

        • Id
        • FirstName
        • LastName
      • 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将值插入到多个表中

    本文发布于:2023-07-15 10:41:52,感谢您对本站的认可!
    版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
    本文标签:多个   如何使用   spring   hibernate

    发布评论

    评论列表 (有 0 条评论)
    草根站长

    >www.elefans.com

    编程频道|电子爱好者 - 技术资讯及电子产品介绍!