【问题标题】:How insert values to multiple tables using spring and hibernate如何使用spring和hibernate将值插入多个表
【发布时间】:2015-07-30 15:28:50
【问题描述】:

我在数据库中有一个表:

  1. 用户角色(字典)

    • 身份证
    • 姓名(管理员、用户...)
  2. 用户登录

    • 身份证
    • 电子邮件
    • 密码
  3. 用户配置文件

    • 身份证
    • 名字
    • 姓氏
  4. 用户

    • 身份证
    • IdUserLogin (FK)
    • IdUserRole (FK)
    • IdUserProfile (FK)

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

我尝试过这样的事情:

控制器:

@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 页面:

<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>

【问题讨论】:

  • 那么您面临什么问题?有什么例外,或者您没有在服务类中写什么?
  • 1.当我有几个表单时,如何在方法 POST 中获取属性?现在我没有得到任何属性。 2.如何向表Users插入值?我需要最后一个插入 ID 还是什么?
  • 在视图中,您必须采用一个 &lt;form:form&gt; 并通过使用视图模型概念或使用模型来代替多个 modelAttribute,您必须在 POST 方法中仅采用一个 modelAttribute,并且在服务中您可以保存受人尊敬的模型单独或您可以使用级联选项。 This 将有助于学习如何将模型属性发送到 POST

标签: java spring hibernate


【解决方案1】:

注意:如果您将代表每个表的 java 类添加到您的问题中,这将非常有帮助。

您应该添加描述您的表如何与您的类 (pojos) 相关的元数据,并将 CascadeType 设置为 PersistALL,例如:

@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;

然后可以设置子类/表的各自值,插入父类/表:

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);

[编辑]

我不确定你如何持久化你的对象,但我假设你在你的 服务(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());
    return "userNew";
}

2。或者

@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";
}

[编辑 2]

正如@Amogh 指出的那样,您的观点也存在问题。据我所知,即使在 JSP/JSF 中,您也应该有以下内容:

请注意:我不了解 Spring,也很长时间没有使用过 JSP/JSF,所以这可能不是完全准确或最有效的方法。

<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>

【讨论】:

  • 我不使用 JSF,但我认为视图并不重要,您将在模型中执行逻辑。检查我的答案中的编辑。
  • @Amogh 现在我明白你在说什么,他有嵌套/多个表单,这是错误的。请查看我上次的编辑。
  • 感谢@Amogh 和@Francisco C 的回复! :)
  • 嗨@Pablo,如果此答案回答了您的问题,请将其标记为您的答案,以便它可以帮助其他 SO 用户。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-14
  • 2018-03-12
  • 2016-03-17
  • 1970-01-01
  • 1970-01-01
  • 2014-11-20
相关资源
最近更新 更多