Java 如何在hibernate/jpa中保存一对多?

Java 如何在hibernate/jpa中保存一对多?,java,hibernate,jsp,Java,Hibernate,Jsp,不确定我是否正确描述了与JPA的一对多关系。 我有三张桌子: 杂工表包含姓名、地址、电话号码等。 公司表有:公司名称、地址、电话号码等。 工单表:工单编号、工作地点地址、FK到杂工ID、FK到公司ID。 添加新的工作订单时,我使用select从数据库中选择公司和杂工姓名,然后填写工作订单表单。 现在的问题是如何保存它 Handyman.java @OneToMany(cascade=CascadeType.ALL) @JoinColumn(name="Handymans_list_id")

不确定我是否正确描述了与JPA的一对多关系。 我有三张桌子: 杂工表包含姓名、地址、电话号码等。 公司表有:公司名称、地址、电话号码等。 工单表:工单编号、工作地点地址、FK到杂工ID、FK到公司ID。 添加新的工作订单时,我使用select从数据库中选择公司和杂工姓名,然后填写工作订单表单。 现在的问题是如何保存它

Handyman.java

  @OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name="Handymans_list_id")
private Set<WorkOrder> workOrders;
public Set<WorkOrder> getWorkOrders() {
    return workOrders;
}
public void setWorkOrders(Set<WorkOrder> workOrders) {
    this.workOrders = workOrders;
}
    @OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name="Companys_list_id")
private Set<WorkOrder> workOrders;
public Set<WorkOrder> getWorkOrders() {
    return workOrders;
}
public void setWorkOrders(Set<WorkOrder> workOrders) {
    this.workOrders = workOrders;
}
    @ManyToOne(optional=false)
@JoinColumn(name="Companys_list_id", referencedColumnName="id")
//@ManyToOne  
//@JoinColumn(name = "Companys_list_id")
private Company company;

@ManyToOne(optional=false)
@JoinColumn(name="Handymans_list_id", referencedColumnName="id")

//@ManyToOne  
//@JoinColumn(name = "Handymans_list_id") 
private Handyman handyman;
    public WorkOrder saveWorkOrder(WorkOrder workOrder)
{
    System.out.println("Open session for saving work order ...");
    SessionFactory sf = HibernateUtil.getSessionFactory();
    Session session =  sf.openSession();
    Transaction trans = session.beginTransaction();
    //Integer id = (Integer) session.save(workOrder);
    //Company company = workOrder.getCompany();
    //Handyman handyman = new Handyman();
    //String name  = handyman.getHandymanName();
    //System.out.println("Printing company =" + company);
    //System.out.println("Printing handyman = "+ handyman);
    //System.out.println("Handymans name = " + name);

    //

    //workOrder.setCompany(company);

    //workOrder.setHandyman(handyman);
    System.out.println("Workorder "+workOrder);
    Integer id = (Integer) session.save(workOrder);

    trans.commit();
    workOrder.setId(id);
    session.close();
    return workOrder;

}
@OneToMany(cascade=CascadeType.ALL,mappedBy="company")
private Set<WorkOrder> workOrders;
@ManyToOne(optional=false)
@JoinColumn(name="Companys_list_id", referencedColumnName="id")
private Company company;

@ManyToOne(optional=false)
@JoinColumn(name="Handymans_list_id", referencedColumnName="id")
private Handyman handyman;
workordaohibernate.java

  @OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name="Handymans_list_id")
private Set<WorkOrder> workOrders;
public Set<WorkOrder> getWorkOrders() {
    return workOrders;
}
public void setWorkOrders(Set<WorkOrder> workOrders) {
    this.workOrders = workOrders;
}
    @OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name="Companys_list_id")
private Set<WorkOrder> workOrders;
public Set<WorkOrder> getWorkOrders() {
    return workOrders;
}
public void setWorkOrders(Set<WorkOrder> workOrders) {
    this.workOrders = workOrders;
}
    @ManyToOne(optional=false)
@JoinColumn(name="Companys_list_id", referencedColumnName="id")
//@ManyToOne  
//@JoinColumn(name = "Companys_list_id")
private Company company;

@ManyToOne(optional=false)
@JoinColumn(name="Handymans_list_id", referencedColumnName="id")

//@ManyToOne  
//@JoinColumn(name = "Handymans_list_id") 
private Handyman handyman;
    public WorkOrder saveWorkOrder(WorkOrder workOrder)
{
    System.out.println("Open session for saving work order ...");
    SessionFactory sf = HibernateUtil.getSessionFactory();
    Session session =  sf.openSession();
    Transaction trans = session.beginTransaction();
    //Integer id = (Integer) session.save(workOrder);
    //Company company = workOrder.getCompany();
    //Handyman handyman = new Handyman();
    //String name  = handyman.getHandymanName();
    //System.out.println("Printing company =" + company);
    //System.out.println("Printing handyman = "+ handyman);
    //System.out.println("Handymans name = " + name);

    //

    //workOrder.setCompany(company);

    //workOrder.setHandyman(handyman);
    System.out.println("Workorder "+workOrder);
    Integer id = (Integer) session.save(workOrder);

    trans.commit();
    workOrder.setId(id);
    session.close();
    return workOrder;

}
@OneToMany(cascade=CascadeType.ALL,mappedBy="company")
private Set<WorkOrder> workOrders;
@ManyToOne(optional=false)
@JoinColumn(name="Companys_list_id", referencedColumnName="id")
private Company company;

@ManyToOne(optional=false)
@JoinColumn(name="Handymans_list_id", referencedColumnName="id")
private Handyman handyman;
workorder3.jsp

    <s:form action="resultAction1" namespace="/">

        <s:actionerror/>
        <s:textfield name="workOrder.workOrder"      label="Work order number" />
        <s:textfield name="workOrder.address"        label="Adress/Location" />
        <s:textfield name="workOrder.email"          label="Email" />
        <s:textfield name="workOrder.comment"        label="Comment" />
        <s:textfield name="workOrder.dateReceived"   label="Date receved" />
        <s:textfield name="workOrder.price"          label="Price" />

<h4>
<s:select label="Pick the company name " 
    headerKey="-1" headerValue="Select Company name"
    list="companyList" 
    name="yourCompanyList" 
     />
</h4> 

<h4>
<s:select label="Pick handyman name " 
    headerKey="-1" headerValue="Select Handyman name"
    list="handymanList" 
    name="yourHandymanList" 
     />
</h4> 


        <s:submit value="submit" name="submit" />

您试图通过在HandyMan and Company中放置对WorkOrder的引用来定义双向关系。在双向关系中,只有一方是关系的主人。所有者端将有@JoinColumn注释,而另一端将在@OneToMany中有一个mappedBy属性,该属性引用映射@JoinColumn的bean属性

因此,您的类映射将如下所示:

Handyman.java

@OneToMany(cascade=CascadeType.ALL,mappedBy="handyman")
private Set<WorkOrder> workOrders;
保存时

HandyMan handyMan = new HandyMan();
handyMan.setId() // Set the selected id.

Company company = new Company();
company.setId() // Set the selected company id.

workOrder.setCompany(company);
workOrder.setHandyMan(handyMan);

// Populate other details of work order and save using hibernate api.

您试图通过在HandyMan and Company中放置对WorkOrder的引用来定义双向关系。在双向关系中,只有一方是关系的主人。所有者端将有@JoinColumn注释,而另一端将在@OneToMany中有一个mappedBy属性,该属性引用映射@JoinColumn的bean属性

因此,您的类映射将如下所示:

Handyman.java

@OneToMany(cascade=CascadeType.ALL,mappedBy="handyman")
private Set<WorkOrder> workOrders;
保存时

HandyMan handyMan = new HandyMan();
handyMan.setId() // Set the selected id.

Company company = new Company();
company.setId() // Set the selected company id.

workOrder.setCompany(company);
workOrder.setHandyMan(handyMan);

// Populate other details of work order and save using hibernate api.

您试图通过在HandyMan and Company中放置对WorkOrder的引用来定义双向关系。在双向关系中,只有一方是关系的主人。所有者端将有@JoinColumn注释,而另一端将在@OneToMany中有一个mappedBy属性,该属性引用映射@JoinColumn的bean属性

因此,您的类映射将如下所示:

Handyman.java

@OneToMany(cascade=CascadeType.ALL,mappedBy="handyman")
private Set<WorkOrder> workOrders;
保存时

HandyMan handyMan = new HandyMan();
handyMan.setId() // Set the selected id.

Company company = new Company();
company.setId() // Set the selected company id.

workOrder.setCompany(company);
workOrder.setHandyMan(handyMan);

// Populate other details of work order and save using hibernate api.

您试图通过在HandyMan and Company中放置对WorkOrder的引用来定义双向关系。在双向关系中,只有一方是关系的主人。所有者端将有@JoinColumn注释,而另一端将在@OneToMany中有一个mappedBy属性,该属性引用映射@JoinColumn的bean属性

因此,您的类映射将如下所示:

Handyman.java

@OneToMany(cascade=CascadeType.ALL,mappedBy="handyman")
private Set<WorkOrder> workOrders;
保存时

HandyMan handyMan = new HandyMan();
handyMan.setId() // Set the selected id.

Company company = new Company();
company.setId() // Set the selected company id.

workOrder.setCompany(company);
workOrder.setHandyMan(handyMan);

// Populate other details of work order and save using hibernate api.