使用jpa将地图值添加到数据库中

Adding map values into database using jpa

标题说明了一切。现在我的代码将键值添加到数据库中,我认为问题出在我的模型 class 或 servlet class 中。我想将 Map<String, String> 值保存到 String customerType 字段

型号:

@Id
@SequenceGenerator(name = "my_seq", sequenceName = "seq1", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "my_seq")
public long id;
private String firstName;
private String customerType;

@ElementCollection
@Column(name="customerType")
public Map<String, String> customerTypes;

我使用 servlet class 将值放入映射中,如下所示:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


    showForm(request, response);

}
private void showForm(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
    Map<String, String> map = new LinkedHashMap<String, String>();

       map.put("","");
       map.put("customerType.private", "Private");
       map.put("customerType.corporate", "Corporate");

    Customer customer = new Customer();

    customer.setCustomerTypes(map);
    request.setAttribute("customer", customer);

    request.getRequestDispatcher("/Add.jsp").forward(request, response);    
}

注意!我将地图值发送到 Add.jsp 页面(简单的用户添加表单)中的 select 标签,数据从那里保存到数据库中。保存数据时,customerType 的格式为 customerType.corporatecustomerType.private,但应为 CorporatePrivate

我认为您使用 @ElementCollection 的方式有误。如果这可行,当您从数据库中读取实体时,您将如何填充映射键? customerTypes 应该在单独的 table 中,请查看 this thread 以了解类似问题的解决方案。像这样

@ElementCollection
@MapKeyColumn(name="customer_type_key")
@Column(name="customer_type_value")
@CollectionTable(name="customer_types", joinColumns=@JoinColumn(name="customer_id"))
Map<String, String> attributes = new HashMap<String, String>();

更新

关于您的评论,您希望有一个字段,您可以在其中以某种格式输入地图中的值。在这种情况下,您根本不需要 customerTypes,但如果您需要它,可以将其保留为 @Transient 字段。

@Transient
Map<String, String> attributes = new HashMap<String, String>();

对于大多数简单的实现,您可以使用 Map#toString() 作为 customerType 字段的值。

Servlet:

...
    Map<String, String> map = new LinkedHashMap<String, String>();

    map.put("customerType.private", "Private");
    map.put("customerType.corporate", "Corporate");

    Customer customer = new Customer();
    customer.setCustomerType(map.toString());
...

customerType 之后的值将是 {customerType.private=Private, customerType.corporate=Corporate}。如果您想要不同的格式,您将需要一些自定义逻辑。