如何将JSON对象存储到Hibernate数据库字段中

5
我的情况如下。我有一个JSF表单,其中包含三个输出文本和相应的输入文本:
outputtext1 - inputtext1
outputtext2 - inputtext2
outputtext3 - inputtext3
目前,我使用后台bean方法“Save”将它们存储到数据库中(Hibernate对象称为table1,具有主键table1.id),存储在字段table1.field1、table1.field2和table1.field3中。
因此,表中的每条记录都插入在inputtexts中的值。
我的问题是如何将表单数据以以下形式存储在数据库中:
{"outputtext1:inputtext1","outputtext2:inputtext2"."outputtext3:inputtext3"}
然后再次获取它们,解析并重建表单。我考虑将表单数据操作为JSON对象...但我对Java+JSON都很陌生,因此一些指南对我非常有用!
这是一个示例,表单将是动态的,并且会即时创建。

这只是一个字符串,使用 varchar。使用 JSON 序列化器。 - Sotirios Delimanolis
那么我在处理表单数据方面的方向上是正确的吗?由于表单是动态的,因此没有标准格式的表单数据。 - thanili
如果没有标准格式,那么我假设您正在生成JSON字符串。一旦您拥有它,请将其存储在varchar字段中。 - Sotirios Delimanolis
4个回答

4
为什么要将JSON序列化/反序列化以直接发送到数据库?反序列化本身就有问题,多次反序列化可能会导致问题(不一定)。您应该将给定实体的字段保存为属性,然后借助像Gson这样的库从实体生成JSON。

更新

由于您的表单是动态的,因此可以使用一些适应性实体结构来保存您的数据。

您的实体可以具有Map<String,String>属性或者包含键值对的FieldRecord实体集合。

我建议这样做是因为将JSON存储在数据库中可能会导致复杂的问题,特别是如果以后需要查询该数据。您将不得不处理JSON以报告或查找具有特定字段的记录。这只是一个例子,事情可能会变得更加复杂。


表单将是动态的,因此我不会有标准数量或类型的输入字段。这只是一个指示性的例子! - thanili
@thanili 你可以拥有一个带有 Map<String,String> 的实体或者是一个关联实体列表。在我看来,将 JSON 存储到数据库中可能非常难以处理,特别是如果您想稍后查询特定字段。不过,如果您坚持使用 JSON,只需创建它并将其存储到 VARCHAR 变量中即可。 - Fritz
好的 Gamb,我会检查你提供的更简单方法的建议。实际上,为了获取重新加载的表单已提交的值,我必须查询数据库。所以我猜我必须获取JSON对象,反序列化它,解析它,将其与表单字段ID进行比较,并重构表单 :) 这听起来太麻烦了... - thanili
@thanili 这正是我想要避免的 :) - Fritz

2

简单来说,您需要在表中创建一个BLOB类型的列来存储json数据,当您在Java中检索它时,只需解码json即可。我建议使用https://code.google.com/p/json-simple/,它非常简单。


1
JSONObject转换为String格式并存储。当读取时,按如下方式将其转换回JSONObject
       JSONObject obj = new JSONObject(stringRepresentationOfJSON);

-2
将 hibernate-mapping 更改为以下内容 JSONObject obj = new JSONObject(stringRepresentationOfJSON);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接