2014-09-11 78 views
0

我正在使用Hibernate和Spring MVC。我有以下形式ManyToOne - 保存时未设置外键

enter image description here

当我提交我想我的数据库表来填补像下面的形式:

表名:学生

student_id  studentName 
1.   Jason Stathum 

表名:studentdetails

studentDetailsid FatherName MotherName city_id student_id 
    1     Mr.X   Mrs. Y  1   1 

但是当我真正运行我的应用程序并插入表单数据时,除非列city_id没有被填满,否则一切正常。该表看起来如下:

表名:studentdetails

studentDetailsid FatherName MotherName city_id student_id 
    1     Mr.X   Mrs. Y  NULL   1 

仅供参考,我也有一台名为城市,它看起来像下面

表名:studentdetails

city_ID city_name 
    1  NewYork 

我已在下面列入我的代码,请告诉我h要解决这个问题吗?

非常感谢您

实体:学生

@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

@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 

实体:市

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

} 

StudentDaoImpl

Session session = getSessionFactory().openSession(); 
Transaction tx; 
tx = session.beginTransaction(); 
session.save(student); 
tx.commit(); 

我的表格: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> 
+0

您在'学生'中设置'cityName'而不是'City'的'id' – 2014-09-11 12:44:04

回答

0

我在这里猜测,但是这可能是因为你在输入记录时没有真正选择一个城市,而只是输入了一个学生姓名,一个父亲姓名和一个母亲姓名,并且把城市留在了第一个城市在你的名单上,这恰好是“纽约”。也许你可以添加一个额外的“请选择”选项,用一个验证器强制你选择一个城市。

此外,我注意到您在某些地方使用city_id,而在其他地方使用city_ID。你的数据库对列名不区分大小写吗?

+0

感谢您的回复。我尝试了额外的“请选择”选项,但它没有奏效。我用'city_ID'来引用我的'city'table,我用'city_id'作为'studentDetails'表中的外键列。我认为我的数据库对列名不区分大小写。谢谢 – 2014-09-11 14:31:04

0

我已经解决了这个问题:)我在我的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>