表插入失败,也要在外部表上重新输入

时间:2019-01-13 08:15:01

标签: postgresql hibernate spring-mvc jsp

我正在将postgres数据库与hibernate一起用作ORM。 我有一个名为District的表,带有外键分区。

但是插入后,它会在分区表和分区表上都进行新输入。首先,它在除法表上创建一个新条目(此时将创建新的ID)。然后,使用新的划分ID在区表上创建新条目。

CREATE TABLE district(   
  id SERIAL,    
  division_id INTEGER REFERENCES division(id),   
  name varchar(30),   
  PRIMARY KEY (id) 
);

这是我的模型:

@Entity
@Table(name = "district")
public class District implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id")
    private Integer id;

    @ManyToOne(cascade = {CascadeType.ALL})
    @JoinColumn(name="division_id")
    private Division division;

    @Column(name="name")
    private String name;
    // getter setter

我的控制器:

@GetMapping(value = "/createdistrict")
public ModelAndView  createdistrict(Locale locale, Model model) {

    List<Division> allDivisionList = new ArrayList<Division>();
    allDivisionList = this.districtService.listdivisions() ;
    Map<Integer,String> allDivision = new LinkedHashMap<Integer,String>();
    for( int i=0 ; i < allDivisionList.size() ; i++) {

        allDivision.put(allDivisionList.get(i).getId() , allDivisionList.get(i).getName());
    }

    return new ModelAndView("createdistrict" , "allDivision" , allDivision);
}

DAO:

@Override
public void adddistrict(District p) {
   Session session = this.sessionFactory.getCurrentSession();
   session.saveOrUpdate(p);
   logger.info("District saved successfully, Phone Details=" + p);
}

我的jsp页面:

 <tr>
                    <td>
                        Division 
                    </td>
                    <td>
                    <select id="division" name="division">
                          <c:forEach items="${allDivision}" var="allDivision">
                          <option value="${allDivision.key}">${allDivision.value }</option>
                          </c:forEach>
                    </select> 
                    </td> 
                  </tr>

create district page

1 个答案:

答案 0 :(得分:1)

似乎无法将Division对象设置为子表的District对象。使用选定的id中的Division查找超类的对象。然后将对象设置为District对象。然后,保存名为District的子表对象。

完成。