2017-08-23 54 views
0

我想將項目列表插入從多個選擇表單提交的數據庫表中。如何定義POJO來保存提交表單中的數據列表?

我提交的形式是:

<form method="post" action="${pageContext.request.contextPath }/"> 
    <div> 
     <label>User:</label> 
     <select name="customer"> 
      <option value="">Select Customer</option> 
      <c:forEach var="c" items="${ cList }"> 
       <option value="${ c.id }">${ c.name }</option> 
      </c:forEach> 
     </select> 
    </div><br> 
    <div> 
     <label>Hobby:</label> 
     <select name="product" multiple size="8"> 
      <!-- <option value="">Select Items</option> --> 
      <c:forEach var="p" items="${ pList }"> 
       <option value = "${ p.id }">${ p.productName }</option> 
      </c:forEach> 
     </select> 
    </div> 
    <br><br> 
    <input type="submit" value="Send"> 
</form> 

,至今我已經做到了這一點:

我的交易POJO:

@Entity 
@Table(name = "transcation") 
public class Transcation { 

    @Id 
    @GeneratedValue 
    @Column 
    private Long id; 
    @JoinColumn 
    @OneToOne 
    private Customer customer; 
    @JoinColumn 
    @OneToMany 
    private List<Product> product; 
    ... 

我的產品POJO:

@Entity 
@Table(name = "product") 
public class Product { 

    @Id 
    @GeneratedValue 
    @Column 
    private Long id; 
    @Column 
    private String productName; 
    ... 

但是當我運行這個項目我得到這個類型的數據庫表格的transcation和產品:

Product table in database

Transaction table in database

我需要與交易表中的項目和客戶ID的列表中插入客戶的交易。

+0

你確實在映射實體'List '在'Transaction'中有問題嗎? –

+0

@ShafinMahmud,是的,我也想知道如何將產品列表插入交易表。 – Space

回答

0

您想要在事務表中映射集合類型(列表)。你應該嘗試與註解註釋@ElementCollection列表如下圖所示:

... 
@JoinColumn 
@OneToMany 
@ElementCollection 
private List<Product> product; 

當然,我們想當然地認爲Product表中確實存在中。

+0

但我得到的數據庫架構不正確......如上面數據庫表中提到的...事務表不具有product_id引用密鑰... – Space

1

我假設數據庫表是從您定義的實體生成的。因此可以生成這樣的表格。但問題是你正在解釋TranasactionProduct之間的錯誤關係。

想想 - 它真的是OneToMany關係嗎?我猜不是。原因不僅是Transaction包含Product列表,而且Product可能在多個Tracnsaction。所以這應該是單向的ManyToMany關係。

如果我理解你的商務本那好吧只是標註你Transaction實體像下面(有@JoinTableManyToMany關係。

@Entity 
@Table(name = "transcation") 
public class Transcation { 

    @Id 
    @GeneratedValue 
    private Long id; 

    @OneToOne 
    @JoinColumn(name="customer_id") 
    private Customer customer; 

    @ManyToMany 
    @JoinTable(name = "transaction_product", 
       joinColumns = @JoinColumn(name = "transaction_id"), 
       inverseJoinColumns = @JoinColumn(name = "product_id")) 
    private List<Product> productList; 
    ... 

@JoinTable實際上在具有外鍵引用數據庫中創建單獨的映射表tranasction_producttransactionproduct表的主鍵。

保存這個關係從UI

假設您從提交中選擇了Customer和選定的Product列表。現在創建一個Transaction。簡單地分配值,並通過打開的session

Transaction transaction = new Transaction(); 
transaction.setCustomer(customer); 
transaction.setProductList(productList); 
+0

根據您的描述,我有以下問題:[鏈接](https:/ /stackoverflow.com/questions/45835354/how-to-insert-the-multiple-value-from-select-form-into-database) – Space

+0

如果你發現這個答案解決了你的問題,那麼你應該接受它。當然,你的另一個問題可以在那裏解決。但是,如果它解決了您的問題,請先接受它。 –

1

您的實體保存Tranasction對象似乎是正確的。 首先請將產品添加到數據庫中。考慮你已經添加了產品。這些ID是1,2,3。

在通過ID保持交易負載產品並添加到產品列表之前。

然後創建一個交易對象:

Transaction = new Transaction(); 
transaction.setProducts(products); //list of products loaded already into list 

然後等參數進行設置,最後只保存本次交易。

+0

我猜這裏的實體關係不正確。 @Space存在產生意外關係的模式問題。 –

+0

請試試這個。這將工作.. @OneToMany(mappedBy =「products」) private list products = new ArrayList (); – Datta