当前位置: 首页 > 知识库问答 >
问题:

如何使用Spring和Hibernate将值插入到多个表

石博艺
2023-03-14

我在数据库中有一个表:

> < li>

用户角色(字典)

  • id
  • 名称(管理员、用户…)

用户登录

  • Id
  • 电子邮件
  • 密码

用户简介

  • Id
  • 名字
  • 姓氏

用户

  • Id
  • IdUserLogin(FK)
  • IdUserRole(FK)
  • 标识用户配置文件(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个答案

贺卜霸
2023-03-14

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

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

@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等)中这样做。

你可以把我上面写的放在你下面的方法中。

@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>
 类似资料:
  • 我想在交叉表中插入大量的实体。为此,我想启用Hibernate的批处理插入选项,这样每次插入将不是添加1行,而是一次添加20或50行。 我正在尝试重现Hibernate教程的结果。我创建了一个测试函数,它将尝试插入30个客户,就像在示例中一样: Customer类没有生成的ID。 在收到Vlad Mihalcea的回答后,我意识到是的,事实上批处理语句是有效的,至少在hibernate和jdbc级

  • 问题内容: 我正在循环列表并将其插入数据库中,但它得到的更新记录一个接一个。最后我只在列表中的数据库最后一条记录中看到。 输入名称:Linux,Windows,Mac hibernate.cfg.xml: 这里有3次获得循环并插入数据库。但是以某种方式覆盖了这些值。因为我看到sql插入和更新在控制台中运行。 请帮助我将多个行插入数据库。 问题答案: Hibernate文档中有一章非常好的关于批处理

  • 我在postgreSQL DB(9.2)中有一个表,其中列类型为json。我正在使用Hibernate,并实现了Tim Fulmer建议的将postgreSQL JSON列映射到Hibernate值类型的代码示例,但我不断得到以下异常: 我不想强制转换表达式,因为不建议使用它。当我使用预先生成的表并且列类型为JSON时,我得到了这个错误。当我更改Hibernate配置以构建表时,我没有得到异常,值

  • 问题内容: 有人可以告诉我,以下JDBC代码中的第一个条件是否是针对两个不同的表执行两个不同的SQL查询? 问题答案: 在我的书中,我总是建议关闭已经打开的资源,以避免可能的泄漏。 一种更现代的方法是使用try-with- resources :

  • 现在我想在文本框中输入一些日期,并在下拉列表中选择一些值。 当我点击它应该得到保存到数据库。 我该怎么做? 这是我的密码 php插入代码:当我点击提交时,这个php代码应该 下拉列表是动态生成的 代码: ui看起来像这样...

  • 问题内容: 我创建了一个数据库名称movielibrarysystem,其中有3个表。 分别是类型,发布者和电影..​​.现在1个发布者可以有很多电影,而1个电影则有很多类型..在movie表中,发布者ID和typeid都充当外键。 我的问题是,如何在电影表中插入数据…我已经将数据插入到发行商和类型表中,但是我无法插入电影表中。 问题答案: 这就是你要做的。首先,发行人与电影之间的关系是一对多的-