3 回答

TA貢獻1785條經(jīng)驗 獲得超8個贊
您可以將JsonNode json屬性定義為@TransientJPA 不會嘗試將其存儲在數(shù)據(jù)庫中。但是,jackson 應(yīng)該能夠?qū)⑺鼇砘剞D(zhuǎn)換為 Json。
然后您可以為 JPA 編寫 getter/setter 代碼,這樣您就可以從 JsonNode 來回轉(zhuǎn)換為 String。您定義了一個getJsonString轉(zhuǎn)換JsonNode json為String. 那個可以映射到表列,例如“json_string”,然后定義一個設(shè)置器,在其中接收String來自 JPA 的值并將其解析為可用于杰克遜的 JsonNode。
不要忘記添加@JsonIgnore,getJsonString這樣杰克遜就不會嘗試將 json 轉(zhuǎn)換為 jsonString。
@Entity
@Table(name = "cats")
public class Cat {
private Long id;
private String name;
@Transient
private JsonNode json;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Long getId() {
return id;
}
@Column(name ="name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void setId(Long id) {
this.id = id;
}
// Getter and setter for name
@Transient
public JsonNode getJson() {
return json;
}
public void setJson(JsonNode json) {
this.json = json;
}
@Column(name ="jsonString")
public String getJsonString() {
return this.json.toString();
}
public void setJsonString(String jsonString) {
// parse from String to JsonNode object
ObjectMapper mapper = new ObjectMapper();
try {
this.json = mapper.readTree(jsonString);
} catch (Exception e) {
e.printStackTrace();
}
}
}

TA貢獻1876條經(jīng)驗 獲得超6個贊
如本文所述,您不必手動創(chuàng)建自定義 Hibernate 類型,因為您可以使用以下依賴項通過 Maven Central 簡單地獲取它:
<dependency>
<groupId>com.vladmihalcea</groupId>
<artifactId>hibernate-types-52</artifactId>
<version>${hibernate-types.version}</version>
</dependency>
有關(guān)更多信息,請查看Hibernate Types開源項目。
然后你可以簡單地聲明你類的新類型。
@TypeDef(
name = "jsonb-node",
typeClass = JsonNodeBinaryType.class
)
實體映射將如下所示:
@Type(type = "json-node")
@Column(columnDefinition = "json")
private JsonNode json;

TA貢獻1812條經(jīng)驗 獲得超5個贊
創(chuàng)建響應(yīng)而不將邏輯放入實體 setter/getter 中,不依賴第三方:
ObjectNode node = JsonNodeFactory.instance.objectNode();
node.put("name", cat.getName());
node.set("json", new ObjectMapper().readTree(cat.getJson()));
return Response.ok(node).build();
添加回答
舉報