Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring3MVC:动态表单中的一对多(创建/更新时添加/删除)_Java_Hibernate_Spring Mvc_One To Many_Dynamicform - Fatal编程技术网

Java Spring3MVC:动态表单中的一对多(创建/更新时添加/删除)

Java Spring3MVC:动态表单中的一对多(创建/更新时添加/删除),java,hibernate,spring-mvc,one-to-many,dynamicform,Java,Hibernate,Spring Mvc,One To Many,Dynamicform,我正在寻找一种解决方案,使用jQuery管理HTML表单中的一对多关系。我正在使用Spring、springmvc和Hibernate进行开发。我在网上找到了很多曲目,但没有一个完整的例子 背景 我有三个JPA实体: Consult.java(1) @实体 @表(name=“consult”) 公开课咨询 私有整数id; 私有字符串标签; 私人咨询公司; /*接球手和接球手*/ } ConsultTechno.java(2) @实体 @表(name=“咨询技术”) 公共类咨询公司{ 私有整数i

我正在寻找一种解决方案,使用jQuery管理HTML表单中的一对多关系。我正在使用SpringspringmvcHibernate进行开发。我在网上找到了很多曲目,但没有一个完整的例子

背景 我有三个JPA实体:

Consult.java
(1)

@实体
@表(name=“consult”)
公开课咨询
私有整数id;
私有字符串标签;
私人咨询公司;
/*接球手和接球手*/
}
ConsultTechno.java
(2)

@实体
@表(name=“咨询技术”)
公共类咨询公司{
私有整数id;
私营科技公司;
私人咨询;
私有字符串级别;
/*接球手和接球手*/
}
Techno.java
(3)

@实体
@表(name=“techno”)
公共级技术{
私有整数id;
私有字符串标签;
私人咨询公司;
/*接球手和接球手*/
}
如图所示,一个Consult(1)包含n个ConsultTechnos(2),它们由一个level和一个Techno(3)表示

需求 使用HTML表单,我希望有一个
添加一个techno
按钮,可以在DOM中动态添加两个字段:


当然,每次用户单击按钮时,都应该重新添加这两个字段,以此类推。我选择了
input type=“text”
作为示例,但最后,字段将是两个
select

应涵盖四种操作:

  • 创建新的主实体时添加子实体
  • 创建新的主实体时删除子实体
  • 更新新主实体时添加子实体
  • 更新新主实体时删除子实体
  • 问题 该布局部分已经起作用,但在发布表单时,我无法将动态添加的字段绑定到我的
    @modeldattribute consult

    你知道怎么做那种工作吗?我希望我已经足够清楚了


    提前感谢
    :)

    这一点在网络上仍然非常混乱和不清楚,因此以下是我解决问题的方法。此解决方案可能不是最优化的解决方案,但它在创建和更新主实体时有效

    理论
  • 对于应该动态管理的一对多关系,使用
    列表
    而不是
    集合

  • 将您的
    列表初始化为一个。这是一个惰性列表,允许动态添加元素

  • 向子实体添加
    int
    的属性
    remove
    。这将扮演布尔标志的角色,在动态删除元素时非常有用

  • 发布表单时,仅保留在
    0
    上有标记
    remove
    的元素(即
    false

  • 实践 一个完整的工作示例:一个雇主有许多雇员,一个雇员有一个雇主

    实体:
    Employer.java

    @实体
    @表(name=“雇主”)
    公营雇主
    私有整数id;
    私有字符串名;
    私有字符串lastname;
    私人弦公司;
    私人名单雇员;//一对多
    /*接球手和接球手*/
    }
    
    Employee.java

    @实体
    @表(name=“employee”)
    公营雇员{
    私有整数id;
    @瞬态//表示“不是DB字段”
    私有整数删除;//布尔标志
    私有字符串名;
    私有字符串lastname;
    私人雇主;//多对一
    /*接球手和接球手*/
    }
    
    控制器:
    employeercontroller.java

    @控制器
    @请求映射(“雇主”)
    公共类EmployeerController{
    //动态管理添加或删除的员工
    私人雇员名单(雇主){
    //存储不应持续的员工
    List employees2remove=新建ArrayList();
    if(employer.getEmployees()!=null){
    for(迭代器i=employer.getEmployees().Iterator();i.hasNext();){
    Employee=i.next();
    //如果删除标志为true,则从列表中删除该员工
    if(employee.getRemove()==1){
    employees2remove.add(员工);
    i、 删除();
    //否则,请执行链接
    }否则{
    雇员。雇主(雇主);
    }
    }
    }
    返回员工2移除;
    }
    //--创建新雇主----------
    @RequestMapping(value=“create”,method=RequestMethod.GET)
    创建公共字符串(@ModelAttribute雇主,模型模型){
    //应该初始化AutopopulationGlist吗
    返回创建(雇主、模型、真实);
    }
    创建私有字符串(雇主、模型、布尔初始化){
    if(init){
    //在自动人群英语中
    雇主.setEmployees(新的自动人口英语(Employee.class));
    }
    model.addAttribute(“type”、“create”);
    返回“雇主/编辑”;
    }
    @RequestMapping(value=“create”,method=RequestMethod.POST)
    创建公共字符串(@Valid@modeldattribute雇主,BindingResult BindingResult,Model模型){
    if(bindingResult.hasErrors()){
    //不应该重新初始化AutoPopulationGlist
    返回创建(雇主、模型、假);
    }
    //调用私有方法
    管理雇员(雇主);
    //坚持雇主
    Employeerservice.save(雇主);
    
       <form:form action="yourURL.htm" command="employeeDto">
        <form:input type="text" name="consult.consultTechnos[].techno.id" />
        <form:input type="text" name="consult.consultTechnos[].level" /> 
       <form:form>