我有两个实体:Order
和Item
OneToMany
关系。物品属于一个订单,订单有一组物品。
class Order{
@OneToMany(fetch = FetchType.EAGER, mappedBy = "id_order")
Set<Item> items;
}
class Item{
@ManyToOne(targetEntity = Order.class, fetch = FetchType.LAZY)
@JoinColumn(name = "id_order")
Order id_order;
}
我使用gson
序列化Orders
并将它们发送到另一台机器,但是在序列化期间正在创建一个循环,因为订单和项目都相互引用。
我的目标是,当加载Item
时,字段id_order
应为null
或仅包含ID,以避免传播。 hibernate是否支持此功能?或者我可以在序列化期间排除字段吗?
我已在FetchType.LAZY
上尝试了Item
并在Item
内抓取onLoad() Interceptor
并将其id_order
设置为null
。但它没有用。我试图避免编写自定义适配器或在每次查询时手动解析所有订单中的所有项目。
答案 0 :(得分:3)
我认为它与Hibernate相比并不多,但GSON更多。您应该定义序列化/反序列化规则。
最简单的方法是使用@Expose
注释,从序列化/反序列化中包含/排除给定属性:
@Expose(serialize = false, deserialize = false)
另一种方法是为givem类定义自定义适配器。使用适配器,您可以完全覆盖GSON序列化或反序列化对象的方式。
例如:
public class YourAdapter implements JsonDeserializer<Order>, JsonSerializer<Order> {
@Override
public Orderde serialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
// your logic
}
@Override
public JsonElement serialize(Ordersrc, Type typeOfSrc, JsonSerializationContext context) {
// your logic
}
}
最后初始化你的Gson解析器的实例:
Gson gson = new GsonBuilder()
.registerTypeAdapter(Order.class, new YourAdapter())
.build();
如果要避免写入整个序列化,可以使用@Expose
排除字段,然后使用纯GSON实例编写适配器,使用纯实例序列化/反序列化并手动添加一个字段
处理序列化/反序列化问题的另一种方法是使用此处描述的ExclusionStrategy
:https://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/com/google/gson/ExclusionStrategy.html