Java 如何使用Hibernate和JPA使用父对象自动保存子对象?

Java 如何使用Hibernate和JPA使用父对象自动保存子对象?,java,hibernate,jpa,hibernate-mapping,Java,Hibernate,Jpa,Hibernate Mapping,我有一个OneTONE协会。子类有一个外键,它是父类中的主键。我的问题是无法将子类的对象与父类一起保存 我的添加方法如下: @Transactional public void add(ParentDTO parentDTO) { parentDTO.setChild(child); child.setParent(parentDTO); Parent parent = mapper.map(parentDTO, Parent.class); parentRepo

我有一个OneTONE协会。子类有一个外键,它是父类中的主键。我的问题是无法将子类的对象与父类一起保存

我的添加方法如下:

@Transactional
public void add(ParentDTO parentDTO) {
    parentDTO.setChild(child);
    child.setParent(parentDTO);
    Parent parent = mapper.map(parentDTO, Parent.class);
    parentRepository.save(parent);
}
JSP代码如下所示

<form:form action="user.do" method="POST" commandName="user">
<table>
    <tr>
        <td>User ID</td>
        <td><form:input path="userId" /></td>
    </tr>
    <tr>
        <td>Username</td>
        <td><form:input path="username" /></td>
    </tr>
    <tr>
        <td>Password</td>
        <td><form:password path="password" /></td>
    </tr>
    <tr>
        <td>First Name</td>
        <td><form:input path="firstName" /></td>
    </tr>
    <tr>
        <td>Last Name</td>
        <td><form:input path="lastName" /></td>
    </tr>
    <tr>
        <td>Active</td>
        <td><form:checkbox path="active" /></td>
    </tr>
    <tr>
        <td>ID</td>
        <td><form:label path="ethnicity.ethnicityId" /></td>
    </tr>
    <tr>
        <td>Nationality</td>
        <td><form:input path="ethnicity.nationality" /></td>
    </tr>
    <tr>
        <td>Race</td>
        <td><form:input path="ethnicity.race" /></td>
    </tr>
    <tr>
        <td>Region</td>
        <td><form:input path="ethnicity.region" /></td>
    </tr>
    <tr>
        <td>Religion</td>
        <td><form:input path="ethnicity.religion" /></td>
    </tr>
            <tr>
        <td colspan="2">
            <input type="submit" name="action" value="Add" />
            <input type="submit" name="action" value="Edit" />
            <input type="submit" name="action" value="Delete" />
            <input type="submit" name="action" value="Search" />
        </td>
    </tr>
</table>

用户ID
用户名
密码
名字
姓
活跃的
身份证件
国籍
比赛
区域
宗教

控制器代码

@RequestMapping(value="/user.do", method=RequestMethod.POST)
public String doActions(@ModelAttribute UserDTO user,
        BindingResult result, @RequestParam String action,
        Map<String, Object> map){
    UserDTO userResult = new UserDTO();
    switch(action.toLowerCase()){
    case "add":
        userService.add(user);
        break;
@RequestMapping(value=“/user.do”,method=RequestMethod.POST)
公共字符串doActions(@modeldattribute UserDTO user,
BindingResult,@RequestParam字符串操作,
(地图){
UserDTO userResult=new UserDTO();
开关(action.toLowerCase()){
案例“添加”:
添加(用户);
打破

您使用的是spring表单,因此在控制器中,您将在模型属性中获得您的对象

您可以按如下方式操作:

childDTO.setNationality(user.getEthnicity().getNationality());
如果您使用的是servlet,那么您可以通过

childDTO.setNationality(request.getParameter("nationality"));
在Spring controller中,还有其他获取jsp输入的方法:

   @Transactional
    public void add(ParentDTO parentDTO) {
//your child object should have all the property set here so that all values will be automatically inserted.
parentDTO.setChild(child);
child.setParent(parentDTO);
Parent parent = mapper.map(parentDTO, Parent.class);
parentRepository.save(parent);
//Even you can set property here

}

在映射器调用后检查/调试父对象。
Parent Parent=mapper.map(parentDTO,Parent.class);
是否映射完整的子数据?

检查级联option@Namancascade选项为cascade=CascadeType.ALL,用于两个实体。我可以将外键保存在child中,但不能保存child类的其他属性。是否设置了child的其他属性?在该实现中,不可见您在何处初始化ild和setting属性
childto.setNationality(childto.getNationality());
我试图这样保存它,但无法保存,但当我试图像
childto.setNationality(“xyz”);
那样硬编码它时,属性得到了值。你能解释一下如何动态保存这些值吗?你在childto.getNationality中做什么()
ethnicityDTO.setNationality(ethnicityDTO.getNationality());
无法检索该值。我编辑了以下内容:childDTO.setNationality(user.getNationality.getNationality());尝试了此操作,但得到了“java.lang.NullPointerException”异常。您在哪里编写了设置国籍的代码?setter和getter在model和DTO类中。在service类中,我只想获取这些vlue。我有debug,但子对象为NULL,这就是问题所在。您可能正在使用某种映射器框架,验证配置(可能是映射xml)用于将ParentDTO映射到父类。我可能无法进一步提供帮助。我正在使用批注。