使用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.corporate
或 customerType.private
,但应为 Corporate
或 Private
。
我认为您使用 @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}
。如果您想要不同的格式,您将需要一些自定义逻辑。
标题说明了一切。现在我的代码将键值添加到数据库中,我认为问题出在我的模型 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.corporate
或 customerType.private
,但应为 Corporate
或 Private
。
我认为您使用 @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}
。如果您想要不同的格式,您将需要一些自定义逻辑。