简体   繁体   English

实现一对一关系船春冬

[英]Implementing one to one relation ship spring hibernate

I have a table cards which is related to some other master tables (divisions and units) with one to one relation. 我有一张桌cards ,它与其他一些主表(部门和单位)具有一对一关系。

On UI I am showing drop downs to select the division and unit values for card, this is the function to create form in CardController.java 在UI上,我显示用于选择卡的除法和单位值的下拉列表,这是在CardController.java创建表格的功能

@RequestMapping(value = "/addCardForm", method = RequestMethod.GET)
    public String addCardForm(ModelMap map)
    {
        map.addAttribute("divisions", divisionService.getAllDivisions());
        map.addAttribute("units", unitService.getAllUnits());
        return "admin/addCard";
    }

addCard.jsp : addCard.jsp

<form:form  method="post" action="addCard">
<table cellspacing="10" id="card-table">
            <tr>
                <td><label for="division" class="control-label">Division : </label></td>
                <td><select name="division" class="selectpicker">
                    <option>Select</option>
                    <c:forEach items="${divisions}" var="division">
                        <option value="${division.id}">${division.name}</option>
                    </c:forEach>
                </select></td>
            </tr>
            <tr>
                <td><label for="unit" class="control-label">Unit : </label></td>
                <td><select name="unit" class="selectpicker">
                    <option>Select</option>
                    <c:forEach items="${units}" var="unit">
                        <option value="${unit.id}">${unit.name}</option>
                    </c:forEach>
                </select></td>
            </tr>
            <tr>
                <td><button type="submit" class="btn btn-primary">Submit</button></td>
                <td></td>
            </tr>

</table>
</form>

Drop downs are populated with the data but on submitting form its not setting division or unit to the cardEntity object they are set to null, this is the addCard function in controller : 下拉列表中填充了数据,但在将其未设置的除法或单位提交给cardEntity对象时,将其设置为null,这是控制器中的addCard函数:

@RequestMapping(value = "/addCard", method = RequestMethod.POST)
    public String addCard(@ModelAttribute(value="card") CardEntity card, BindingResult result)
    {
        cardService.addCard(card);
        //card.getDivision();  -- this is null
        return "redirect:/card";
    }

There are other fields which are added in the card except drop downs. 除下拉菜单外,卡中还添加了其他字段。

CardEntity.java


@Entity
@Table(name="cards")
@Proxy(lazy=false)
public class CardEntity {

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

    @OneToOne
    @JoinColumn(name="division_id", referencedColumnName="id")  
    private DivisionEntity division;


    @OneToOne
    @JoinColumn(name="unit_of_qty_id", referencedColumnName="id")  
    private UnitEntity units;

    public DivisionEntity getDivision() {
        return division;
    }

    public void setDivision(DivisionEntity division) {
        this.division = division;
    }

    public UnitEntity getUnits() {
        return units;
    }

    public void setUnits(UnitEntity units) {
        this.units = units;
    }

}

Edit : 编辑:

I have to set divisionEntity and unitEntity manually : 我必须手动设置divisionEntity和unitEntity:

@RequestMapping(value = "/addCard", method = RequestMethod.POST)
    public String addCard(HttpServletRequest request, @ModelAttribute(value="card") CardEntity card, BindingResult result)
    {
        card.setDivision(divisionService.findOne(Integer.parseInt(request.getParameter("division"))));
        card.setUnit(unitService.findOne(Integer.parseInt(request.getParameter("unit"))));
        cardService.addCard(card);
        return "redirect:/card";
    }

So I guess the problem is divisionEntity and unitEntity objects are not set in card after submitting the form. 所以我想这个问题是divisionEntityunitEntity卡在提交表单之后对象未设置。

You can do this too: 你也可以这样做:

<tr>
    <td><label for="division.id" class="control-label">Division : </label></td>
    <td><select name="division.id" class="selectpicker">
        <option>Select</option>
        <c:forEach items="${divisions}" var="division">
            <option value="${division.id}">${division.name}</option>
        </c:forEach>
        </select></td>
</tr>
<tr>
    <td><label for="unit.id" class="control-label">Unit : </label></td>
    <td><select name="unit.id" class="selectpicker">
        <option>Select</option>
        <c:forEach items="${units}" var="unit">
            <option value="${unit.id}">${unit.name}</option>
        </c:forEach>
        </select></td>
</tr>

The rest is same as your original. 其余与您的原件相同。 But: 但:

  1. Make sure you have a default constrcutor in Division class; 确保您在Division类中具有默认的构造函数;
  2. The CardEntity should have getUnit() and setUnit() , not getUnits() and setUnits() . CardEntity应该具有getUnit()setUnit() ,而不应该具有getUnit() getUnits()setUnits()

Hope it help. 希望对您有所帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM