gpt4 book ai didi

java - 与 Hibernate 的多对多关系的循环序列化

转载 作者:行者123 更新时间:2023-11-29 04:02:57 26 4
gpt4 key购买 nike

我有一个父(程序)pojo 与他们的 child (订阅者)存在多对多关系。

问题是当它序列化一个程序时,它也会序列化程序的订阅者,这涉及序列化他们的程序,这涉及序列化他们的订阅者,直到它序列化了数据库中的每个程序和订阅者。

ERD 看起来像:程序 <-> 订阅者

这意味着返回的 17KB 数据 block (json) 变成了 6.9MB。因此反过来又浪费了序列化数据然后返回数据的时间。

为什么我的 parent 返回 child 是返回 parent 返回 child ?我怎样才能停止这种情况,以便我只获得每个程序的订阅者?我假设我的注释做错了什么,也许?我想保持多对多关系,但没有这种深度嵌套的数据检索。

(注意:我之前曾尝试添加我能找到的尽可能多的 Lazy 注释,只是为了看看是否有帮助。它没有。也许我也做错了?)

程序.java

@Entity
@Table(name="programs")
public class Program extends Core implements Serializable, Cloneable {
...
@ManyToMany()
@JoinTable(name="program_subscribers",
joinColumns={@JoinColumn(name="program_uid")},
inverseJoinColumns={@JoinColumn(name="subscriber_uid")})
public Set<Subscriber> getSubscribers() { return subscribers; }
public void setSubscribers(Set<Subscriber> subscribers) { this.subscribers = subscribers; }

订阅者.java

@Entity
@Table(name="subscribers")
public class Subscriber extends Core implements Serializable {
...
@ManyToMany(mappedBy="subscribers")
public Set<Program> getPrograms() { return programs; }
public void setPrograms(Set<Program> programs) { this.programs = programs;

}

实现

public Collection<Program> list() {
return new Programs.findAll();
}

最佳答案

您没有提到用于 JSON 序列化的框架,所以我假设使用 JAXB。不管怎样,想法是以某种方式使 Subscriber.getPrograms(..) 成为 transient 的,这样它就不会被序列化。 Hibernate 会处理这些“循环”,但其他人不会。所以:

@XmlTransient
@ManyToMany(..)
public Set<Program> getPrograms()...

如果您使用另一个框架,它可能有不同的注释/配置来指定 transient 字段。比如 transient 关键字。

另一种方法是自定义您的映射器以手动处理循环,但这很乏味。

关于java - 与 Hibernate 的多对多关系的循环序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2219694/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com