2017-08-23 18 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