我在数据库中有一张表:
UserRoles(字典)
UsersLogins
- ID
- 电子邮件 密码
UserProfiles 如何将值插入到三个以上的表中? 我试过这样的事情: 控制器: $ $ b $ li $姓名
JSP PAGE: < form:form class =form-horizontal> < 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-horizontalmodelAttribute =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
- 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将值插入到多个表中
发布评论