[英]How to save an object, using Hibernate as persistence, with a foreign key using Jackson?
[英]To save data to foreign key attribute in JPA using java persistence with dropdown element using EJB
嗨,我想使用jpa將jsp文件中的數據保存到derby數據庫中,但是無法將數據保存到數據庫中。 在productorder頁面中:我需要在哪里節省價值
public class ProductOrder implements Serializable {
@ManyToOne
@JoinColumn(name = "customerId")
private Customer customer;
//getter
//setter
}
在EJB文件中:
public class OrderEJB {
@PersistenceContext(unitName = "com.mycompany_Ebusiness_war_1.0-SNAPSHOTPU")
private EntityManager entityManager;
public ProductOrder placeOrder(ProductOrder productOrder) {
entityManager.persist(productOrder);
return productOrder;
}
}
在jsp(xhtml文件)文件中:
<h:form>
<h:selectOneMenu value="#{orderController.customer}" >
<f:selectItems value="#{orderController.customerList}" var="c" itemLabel="#{c.name}" itemValue="#{c.id}" />
</h:selectOneMenu>
<h:commandButton value="Place a Order" action="#{orderController.placeOrder}"/>
</h:form>
我的轉換器文件:
public class CustomerConverter implements Converter{
private transient EntityManager em;
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
return em.find(Customer.class, new Integer(value));
}
@Override
public String getAsString(FacesContext fc, UIComponent uic, Object o) {
return ((Customer) o).getId().toString();
}
}
您的代碼包含一些錯誤/缺失點:
缺少可選的referencedColumnName :如注釋中所述, JoinColumn
批注缺少屬性。 該屬性是可選的,但我想確保引用了什么:
public class ProductOrder implements Serializable { @ManyToOne // replace "id" with the appropriate column name @JoinColumn(name = "customerId", referencedColumnName = "id") private Customer customer; //getter //setter }
referencedColumnName
是FOREIGN KEY
並行。 上面的注釋反映了約束:
FOREIGN KEY (customerId) REFERENCES customer_table(id)
您正在使用JSF,而不是JSP 。 請參考該問題以獲取更多信息 。
您的selectOneMenu
錯誤:
<h:form> <h:selectOneMenu value="#{orderController.customer}" converter="customerConverter"> <f:selectItems value="#{orderController.customerList}" var="c" itemLabel="#{c.name}" itemValue="#{c}" /> </h:selectOneMenu> <h:commandButton value="Place a Order" action="#{orderController.placeOrder}"/> </h:form>
itemValue="#{c}
。 您正在轉換錯誤的值:您的轉換器類轉換了customerId <-> customer object
而在selectOneMenu中,您想要轉換customer name <-> customer object
您的轉換器類可能缺少@FacesConverter
批注
您需要一個一個地解決每個問題:
轉換器 :選擇要在表單中顯示的內容,如果要顯示客戶名稱,則轉換器應如下所示:
@FacesConverter @RequestScoped public class CustomerConverter implements Converter{ // you would normally inject your EJB here. Please refer to BalusC's // answer for more information // private transient EntityManager em; @EJB private CustomerService customerService; @Override public Object getAsObject(FacesContext context, UIComponent component, String value) { return customerService.findByName(value); } @Override public String getAsString(FacesContext fc, UIComponent uic, Object o) { return ((Customer) o).getName(); } }
在您的客戶服務中:
@Stateless public class CustomerServiceImpl implements CustomerService{ @Override public Customer findByName(String name){ // assuming you have a name query to fetch by name, // otherwise use em.createQuery(...) TypedQuery<Customer> query = em.createNamedQuery("Customer.findByName", Customer.class); query.setParameter("name", name); return query.getSingleResult(); } }
當轉換器准備就緒時,相應地調整h:selectOneMenu
和f:selectItems
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.