Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.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 ManyToOne-保存时未设置外键_Java_Spring_Hibernate_Spring Mvc - Fatal编程技术网

Java ManyToOne-保存时未设置外键

Java ManyToOne-保存时未设置外键,java,spring,hibernate,spring-mvc,Java,Spring,Hibernate,Spring Mvc,我正在使用Hibernate和SpringMVC。我有以下表格 当我提交表单时,我希望我的数据库表填写如下: 表名:学生 student_id studentName 1. Jason Stathum @Entity @Table(name = "student") public class Student { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name="student

我正在使用Hibernate和SpringMVC。我有以下表格

当我提交表单时,我希望我的数据库表填写如下:

表名:学生

student_id     studentName
 1.            Jason Stathum
@Entity
@Table(name = "student")
public class Student {

@Id 
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="student_id", nullable= false)
private Integer studentId;
private String studentName;

@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name="student_id", referencedColumnName="student_id")
private List<StudentDetails> studentDetails = new ArrayList<StudentDetails>();

// Getters and Setters
表名:studentdetails

studentDetailsid   FatherName   MotherName    city_id    student_id
   1                 Mr.X          Mrs. Y        1          1
studentDetailsid   FatherName   MotherName    city_id    student_id
   1                 Mr.X          Mrs. Y       NULL          1
city_ID  city_name
   1      NewYork
@Entity
@Table(name = "studentDetails")
public class StudentDetails {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer studentDetailsId;
private String FatherName;
private String MotherName;

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name="city_id")
private City city;

// Getters and Setters
但是当我实际运行我的应用程序并插入表单数据时,除了列
city\u id
没有被填满之外,其他一切都正常工作。该表如下所示:

表名:studentdetails

studentDetailsid   FatherName   MotherName    city_id    student_id
   1                 Mr.X          Mrs. Y        1          1
studentDetailsid   FatherName   MotherName    city_id    student_id
   1                 Mr.X          Mrs. Y       NULL          1
city_ID  city_name
   1      NewYork
@Entity
@Table(name = "studentDetails")
public class StudentDetails {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer studentDetailsId;
private String FatherName;
private String MotherName;

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name="city_id")
private City city;

// Getters and Setters
仅供参考,我还有一个名为city的表,如下所示

表名:studentdetails

studentDetailsid   FatherName   MotherName    city_id    student_id
   1                 Mr.X          Mrs. Y        1          1
studentDetailsid   FatherName   MotherName    city_id    student_id
   1                 Mr.X          Mrs. Y       NULL          1
city_ID  city_name
   1      NewYork
@Entity
@Table(name = "studentDetails")
public class StudentDetails {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer studentDetailsId;
private String FatherName;
private String MotherName;

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name="city_id")
private City city;

// Getters and Setters
我已经在下面列出了我的代码,你能告诉我如何解决这个问题吗

多谢各位

实体:学生

student_id     studentName
 1.            Jason Stathum
@Entity
@Table(name = "student")
public class Student {

@Id 
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="student_id", nullable= false)
private Integer studentId;
private String studentName;

@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name="student_id", referencedColumnName="student_id")
private List<StudentDetails> studentDetails = new ArrayList<StudentDetails>();

// Getters and Setters
实体:城市

@Entity
@Table(name = "CITY")
public class City {

  @Id
  @Column(name="city_ID")
  @GeneratedValue
  private int cityId;

  @Column(name="city_name")
  private String cityName;

  // Getters and Setters
控制器

@RequestMapping(value="addstudent", method = RequestMethod.GET)
public String addStudent(@ModelAttribute("secret") Student student, BindingResult result, Model map)
{
    map.addAttribute("student", new Student());     
    List<City> myCities = subService.getCity();     
    map.addAttribute("city", myCities);     
    return "addStudent";
}

@RequestMapping(value="addstudent", method = RequestMethod.POST)
public String saveStudent(@ModelAttribute("secret") Student student, BindingResult result, Model map)
{
    studentService.addStudent(student);
    map.addAttribute("success", "Submitted");
    return "msg";   

}
我的表单:addStudent.jsp

<c:url var="saveUrl" value="/addstudent" />
<form:form modelAttribute="secret" method="POST" action="${saveUrl}">
   <table>
     <tr>
        <td><form:label path="studentName">Student Name:</form:label></td>
        <td><form:input path="studentName"/></td>
    </tr> 

    <tr>
       <td><form:label path="studentDetails[0].fatherName">Father Name:</form:label></td>
       <td><form:input path="studentDetails[0].fatherName"/></td>
   </tr>

    <tr>
       <td><form:label path="studentDetails[0].motherName">Mother Name:</form:label></td>
       <td><form:input path="studentDetails[0].motherName"/></td>
   </tr>

    <tr>
       <td><label>City</label></td>
       <td><form:select path="studentDetails[0].city">
        <c:forEach var="row" items="${city}">
            <option value="${row.cityId}">${row.city}</option>          
        </c:forEach>
       </form:select> 
      </td>
   </tr>
</table>

<input type="submit" value="Save" />
</form:form>

学生姓名:
父亲姓名:
母亲姓名:
城市
${row.city}

我在这里猜测,是不是在输入记录时,您实际上没有选择一个城市,而是输入了一个学生姓名、父亲姓名和母亲姓名,并将该城市显示在列表中的第一个城市,碰巧是“纽约”。也许您可以添加一个额外的“请选择”选项,使用验证器强制您选择一个城市


另外,我注意到您在某些地方使用city\u id,而在其他地方使用city\u id。您的数据库对列名不区分大小写吗?

我已经设法解决了这个问题:)我在HTML表单中做了一些更改,现在可以使用了

<tr>
  <td><label>City</label></td>
   <td><form:select path="studentDetails[0].city.cityId">
        <c:forEach var="row" items="${city}">
            <option value="${row.cityId}">${row.cityName}</option>          
        </c:forEach>
       </form:select> 
    </td>
</tr>

城市
${row.cityName}

您正在设置
城市名称
而不是
学生
城市
id
,谢谢您的回复。我尝试了额外的“请选择”选项,但它不起作用。我使用
city\u ID
来引用我的
city
表,我使用
city\u ID
来引用
studentDetails
表中的外键列。我认为我的数据库对列名不区分大小写。谢谢