我有两个实体:OneToMany
关系中的Order
和Item
。项目属于订单,而订单有一组项目。
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支持这个特性吗?或者我可以在序列化过程中排除这个字段吗?
我已经在Item
上尝试了FetchType.LAZY
,并在onLoad() Interceptor
中捕获Item
,并将其id_order
设置为null
。但它不起作用。我正在尝试避免编写自定义适配器或在每次查询时手动解析所有订单中的所有项目。
2条答案
按热度按时间fxnxkyjh1#
我相信它与Hibernate没有太多的联系,但与GSON有更多的联系。你应该定义序列化/反序列化规则。
最简单的方法是使用
@Expose
注解,从序列化/反序列化中包括/排除给定的属性:另一种方法是为givem类定义自定义适配器。使用适配器,你可以完全覆盖GSON序列化或反序列化对象的方式。
例如:
最后,初始化Gson解析器的示例:
如果您希望避免编写整个序列化,可以使用
@Expose
排除字段,然后编写带有纯GSON示例的适配器,使用该纯示例进行序列化/反序列化,并手动添加该字段。处理序列化/反序列化问题的另一种方法是使用这里描述的
ExclusionStrategy
:https://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/com/google/gson/ExclusionStrategy.html8hhllhi22#
我知道这不能直接回答这个问题,但可能会帮助其他人,GSON有一个选项,以排除基于一个变量修饰符。
创建一个新的数据库,并在其中添加一个修改器。