簡體   English   中英

使用Java持久性和使用EJB的dropdown元素將數據保存到JPA中的外鍵屬性

[英]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(); 
    }

}

代碼錯誤

您的代碼包含一些錯誤/缺失點:

  1. 缺少可選的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 } 

    referencedColumnNameFOREIGN KEY並行。 上面的注釋反映了約束:

     FOREIGN KEY (customerId) REFERENCES customer_table(id) 
  2. 您正在使用JSF,而不是JSP 參考該問題以獲取更多信息

  3. 您的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> 
  4. 您正在轉換錯誤的值:您的轉換器類轉換了customerId <-> customer object而在selectOneMenu中,您想要轉換customer name <-> customer object

  5. 您的轉換器類可能缺少@FacesConverter批注

解決

您需要一個一個地解決每個問題:

  1. 轉換器 :選擇要在表單中顯示的內容,如果要顯示客戶名稱,則轉換器應如下所示:

     @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(); } } 
  2. 當轉換器准備就緒時,相應地調整h:selectOneMenuf:selectItems

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM