如何在hibernate/jpa中保存一对多?
How to save one-to-many in hibernate/jpa?
不确定我描述的与 JPA 的一对多关系是否正确。
我有 3 个 table:
Handyman table 包含姓名、地址、phone 号码等。
公司 table 有:公司名称、地址、phone 编号等。
工单table:工单号,工地地址,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;
}
Company.java
@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;
}
WorkOrder.java
@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;
WorkOrderDAOHibernate.java
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;
}
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 和 Company 中放置对 WorkOrder 的引用来定义双向关系。在双向关系中,只有一方是关系的所有者。所有者端将具有@JoinColumn 注释,而另一端将在@OneToMany 中具有mappedBy 属性,它引用映射@JoinColumn 的bean 属性。
因此您的 class 映射将如下所示:
Handyman.java
@OneToMany(cascade=CascadeType.ALL,mappedBy="handyman")
private Set<WorkOrder> workOrders;
Company.java
@OneToMany(cascade=CascadeType.ALL,mappedBy="company")
private Set<WorkOrder> workOrders;
并且在WorkOrder.java
@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;
保存时:
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.
不确定我描述的与 JPA 的一对多关系是否正确。 我有 3 个 table: Handyman table 包含姓名、地址、phone 号码等。 公司 table 有:公司名称、地址、phone 编号等。 工单table:工单号,工地地址,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;
}
Company.java
@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;
}
WorkOrder.java
@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;
WorkOrderDAOHibernate.java
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;
}
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 和 Company 中放置对 WorkOrder 的引用来定义双向关系。在双向关系中,只有一方是关系的所有者。所有者端将具有@JoinColumn 注释,而另一端将在@OneToMany 中具有mappedBy 属性,它引用映射@JoinColumn 的bean 属性。
因此您的 class 映射将如下所示:
Handyman.java
@OneToMany(cascade=CascadeType.ALL,mappedBy="handyman")
private Set<WorkOrder> workOrders;
Company.java
@OneToMany(cascade=CascadeType.ALL,mappedBy="company")
private Set<WorkOrder> workOrders;
并且在WorkOrder.java
@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;
保存时:
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.