【问题标题】:How to save child object automatically using a parent object using Hibernate and JPA?如何使用 Hibernate 和 JPA 使用父对象自动保存子对象?
【发布时间】:2015-07-08 21:47:53
【问题描述】:

我有一对一的关联。子类有一个外键,它是父类中的主键。我的问题是我无法用父类保存子类的对象。

我的add方法如下:

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

控制器代码

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

【问题讨论】:

  • 检查您的级联选项
  • @Naman 级联选项对于两个实体都是 cascade=CascadeType.ALL。我可以将外键保存在子类中,但不能保存子类的其他属性。
  • 你设置了child的其他属性了吗?在这个实现中,你在哪里初始化子和设置属性是不可见的
  • childDTO.setNationality(childDTO.getNationality()); 我试图像这样保存它但无法保存,但是当我尝试像childDTO.setNationality("xyz"); 那样对其进行硬编码时,属性得到了值。你能解释一下如何动态保存这些值吗?
  • 你在 childDTO.getNationality() 中做什么

标签: java hibernate jpa hibernate-mapping


【解决方案1】:

您使用的是弹簧形式,因此在控制器中您将在模型属性中获得您的种族对象。

你可以像下面这样:

childDTO.setNationality(user.getEthnicity().getNationality());

如果您使用的是 servlet,您可以获得价值

childDTO.setNationality(request.getParameter("nationality"));

在 Spring 控制器中,还有其他方法可以获取您的 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

}

【讨论】:

  • ethnicityDTO.setNationality(ethnicityDTO.getNationality()); 无法检索该值。
  • 我编辑了这个:childDTO.setNationality(user.getEthnicity.getNationality());
  • 试过了,但我得到一个“java.lang.NullPointerException”异常。
  • 您在哪里编写了设置国籍的代码?
  • setter 和 getter 在模型和 DTO 类中。在服务类中只想获取那些值。
【解决方案2】:

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

【讨论】:

  • 我已经调试过了,但是子对象是 NULL,这就是问题所在。
  • 您可能正在使用某种映射器框架,验证将 ParentDTO 映射到 Parent 类的配置(可能是映射 xml)。我可能无法提供更多帮助。
  • 我正在使用注释。
猜你喜欢
  • 2011-04-25
  • 1970-01-01
  • 2021-05-31
  • 2017-11-23
  • 1970-01-01
  • 1970-01-01
  • 2015-03-01
  • 2012-10-03
  • 1970-01-01
相关资源
最近更新 更多