消除双向递归关系的最简单方法?

2024-01-15

我用Gson http://code.google.com/p/google-gson/将 Java 对象转换为 Json 响应的库... 问题是,在 JPA 请求后,由于与其他实体的递归关系,无法转换从 DB 检索的对象(看我之前的问题 https://stackoverflow.com/questions/10027268/how-to-serialize-a-java-util-liste-to-json-using-gson-library) 例如 :

public class Gps implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "IMEI", nullable = false, length = 20)
    private String imei;
    //some code here...
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "gpsImei", fetch = FetchType.LAZY)
    private List<Coordonnees> coordonneesList;


public class Coordonnees implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "IDCOORDONNEES", nullable = false)
    private Integer idcoordonnees;
    //some code here...
    @JoinColumn(name = "GPS_IMEI", referencedColumnName = "IMEI", nullable = false)
    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    private Gps gpsImei;

我的源代码:

  EntityManagerFactory emf=Persistence.createEntityManagerFactory("JavaApplication21PU");
  GpsJpaController gjc=new GpsJpaController(emf);

  Gps gps=gjc.findGps("123456789012345");

  for(int i=0;i<gps.getCoordonneesList().size();i++){
   gps.getCoordonneesList().get(i).setGpsImei(null);
  }  

  Gson gson=new Gson();
  String json=gson.toJson(gps);//convert to json response

  System.out.println(json);  

正如你在这里看到的,我做了:

   for(int i=0;i<gps.getCoordonneesList().size();i++){
     gps.getCoordonneesList().get(i).setGpsImei(null);
   }  

只是通过为 coordonneesList 中的每个 GPS 对象设置 null 来终止递归关系。

您认为这是一个很好的解决方案还是还有其他更实用的方法? 谢谢


有一个 Gson 扩展名为GraphAdapterBuilder https://github.com/google/gson/blob/1d9e86e27c97cd85d898104b4ac42bb487d0d7d0/extras/src/main/java/com/google/gson/graph/GraphAdapterBuilder.java可以序列化包含循环引用的对象。这是相应测试用例的一个非常简化的示例:

Roshambo rock = new Roshambo("ROCK");
Roshambo scissors = new Roshambo("SCISSORS");
Roshambo paper = new Roshambo("PAPER");
rock.beats = scissors;
scissors.beats = paper;
paper.beats = rock;

GsonBuilder gsonBuilder = new GsonBuilder();
new GraphAdapterBuilder()
    .addType(Roshambo.class)
    .registerOn(gsonBuilder);
Gson gson = gsonBuilder.create();
System.out.println(gson.toJson(rock));

这打印:

{
  '0x1': {'name': 'ROCK', 'beats': '0x2'},
  '0x2': {'name': 'SCISSORS', 'beats': '0x3'},
  '0x3': {'name': 'PAPER', 'beats': '0x1'}
}

请注意,GraphAdapterBuilder 类是not包含在 gson.jar 中。如果您想使用它,则必须手动将其复制到您的项目中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

消除双向递归关系的最简单方法? 的相关文章

  • 如何在 Eclipse 中用阿拉伯语读写

    我在 eclipse 中编写了这段代码来获取一些阿拉伯语单词 然后打印它们 public class getString public static void main String args throws Exception PrintS
  • java.lang.Class: 在 java 程序中初始化 log4j 属性文件时出错

    我正在尝试使用 log4j 运行独立的 java 程序 但在调试时收到以下消息 控制台上没有 log4j 相关日志 log Logger 1343 java lang Class ERROR in 18b4aac2 有人可以建议这里出了什么
  • 将链接对象转换为流或集合

    我想迭代堆栈跟踪 堆栈跟踪由可抛出对象组成 其 getCause 返回下一个可抛出对象 最后一次调用 getCause 返回 null 示例 a gt b gt null 我尝试使用 Stream iterable 这会导致 NullPoi
  • 无法加载 jar 文件的主类

    我使用 Eclipse IDE 开发了一个应用程序 创建应用程序后 我以 jar 格式导出项目 当我尝试运行此 jar 文件时 出现错误 无法加载主类 请帮忙 当您将项目导出为 jar 时 请参阅此所以问题 https stackoverf
  • 有没有好的方法来解析用户代理字符串?

    我有一个Java接收模块User Agent来自最终用户浏览器的字符串的行为需要略有不同 具体取决于浏览器类型 浏览器版本甚至操作系统 例如 FireFox 7 0 Win7 Safari 3 2 iOS9 我明白了User Agent由于
  • MI设备中即使应用程序被杀死,如何运行后台服务

    您好 我正在使用 alaram 管理器运行后台服务 它工作正常 但对于某些 mi 设备 后台服务无法工作 我使用了服务 但它无法工作 如何在 mi 中运行我的后台服务 MI UI有自己的安全选项 所以你需要的不仅仅是上面提到的粘性服务 你需
  • Android - 除了普通 SSL 证书之外还验证自签名证书

    我有一个通过 SSL 调用 Web 服务的 Android 应用程序 在生产中 我们将拥有由受信任的 CA 签名的普通 SSL 证书 但是 我们需要能够支持自签名证书 由我们自己的 CA 签名 我已经成功实施了接受自签名证书的建议解决方案
  • PropertySources 中各种源的优先级

    Spring引入了新的注释 PropertySources对于所有标记为的类 Configuration since 4 0 需要不同的 PropertySource作为论证 PropertySources PropertySource c
  • Java 变量的作用域

    我不明白为什么这段代码的输出是10 package uno public class A int x 10 A int x 12 new B public static void main String args int x 11 new
  • 服务器到 Firebase HTTP POST 结果为响应消息 200

    使用 Java 代码 向下滚动查看 我使用 FCM 向我的 Android 发送通知消息 当提供正确的服务器密钥令牌时 我收到如下所示的响应消息 之后从 FCM 收到以下响应消息 Response 200 Success Message m
  • spring - 强制 @Autowired 字段的 cglib 代理

    我有混合堆栈 EJB 和 Spring 为了将 Spring 自动装配到 EJB 我使用SpringBeanAutowiringInterceptor 不确定这是否会影响我遇到的问题 在尝试通过以下方式自动装配 bean 时 Scope p
  • 如何将 XMP XML 块序列化为现有的 JPEG 图像?

    我有许多 JPEG 图像 其中包含损坏的 XMP XML 块 我可以轻松修复这些块 但我不确定如何将 固定 数据写回图像文件 我目前正在使用 JAVA 但我愿意接受任何能让这项任务变得容易的事情 这是目标关于 XMP XML 的另一个问题
  • cucumber-junit-platform-engine 中的功能文件发现

    In cucumber junit我使用的库 CucumberOptions定义功能文件位置 package com mycompany cucumber import cucumber api CucumberOptions import
  • 使用 java 按电子邮件发送日历邀请

    我正在尝试使用 java 发送每封电子邮件的日历邀请 收件人收到电子邮件 但不会显示接受或拒绝的邀请 而是将该事件自动添加到他的日历中 我正在使用 ical4j jar 构建活动 邀请 private Calendar getInvite
  • @EnableTransactionManagement 的范围是什么?

    我试图了解正确的放置位置 EnableTransactionManagement多个 JavaConfig 上下文的情况下的注释 考虑以下场景 我在 JPAConfig java 和 AppConfig java 中有 JPA 配置以及一组
  • 从 Java 日历迁移到 Joda 日期时间

    以前 当我第一次设计股票应用相关软件时 我决定使用java util Date表示股票的日期 时间信息 后来我体会到了大部分方法java util Date已弃用 因此 很快 我重构了所有代码以利用java util Calendar 然而
  • 将 RSA 密钥从 BigIntegers 转换为SubjectPublicKeyInfo 形式

    WARNING 最初的问题是关于 PKCS 1 编码密钥 而问题中的实际示例需要SubjectPublicKeyInfo X 509 编码密钥 我目前正致力于在 java 中从头开始实现 RSA 算法 特别是密钥生成方面 现在我的代码可以给
  • 来自客户端的超时 Web 服务调用

    我正在使用 RestEasy 客户端调用网络服务 一项要求是 如果调用运行时间超过 5 秒 则中止 超时调用 我如何使用 RestEasy 客户端实现这一目标 我只看到服务器端超时 即如果在一定时间内未完成请求 Rest Easy 网络服务
  • 如何将实例变量传递到 Quartz 作业中?

    我想知道如何在 Quartz 中外部传递实例变量 下面是我想写的伪代码 如何将 externalInstance 传递到此作业中 public class SimpleJob implements Job Override public v
  • 尝试使用带有有效购买令牌的 Java Google Play Developer API v3 检索应用内购买信息时出现错误请求(无效值)

    当使用 Java Google Play Developer API 版本 3 并请求有效购买令牌的购买信息时 我收到以下异常 API 调用返回 400 Bad Request 响应以及以下消息 code 400 errors domain

随机推荐

  • xamarin.android 应用程序签名不起作用

    所以我试图将我的新 Android 应用程序发布到 Google PlayStore 来自阅读this http docs xamarin com guides android deployment testing and metrics
  • DataGrid行虚拟化显示问题

    我们目前有一个DataGrid绑定到一个DataTable 它还具有一个模板列 其中包含CheckBox我们以编程方式添加其中 本专栏的目的是跟踪DataGrid 工厂用于创建CheckBoxes 代表每一行 记录比较多 所以行虚拟化设置为
  • IIS:在.net框架网站下托管.net Core应用程序

    在 ASPNET netframework 网站下托管 ASPNETCore 子应用程序 我有一个托管在 IIS 下的网站 该网站是在 ASP NET MVC 4 中开发的 目标是 NET Framework 4 0 我正在尝试在此网站下添
  • 什么是头等舱公民功能?

    什么是一等公民职能 Java支持一等公民函数吗 Edit 正如提到的维基百科 http en wikipedia org wiki First class function 一流的功能是必要的 对于函数式编程风格 一等函数还有其他用途吗 一
  • 如何在 Spark SQL 中对多个列进行透视?

    我需要在 PySpark 数据框中旋转多个列 示例数据框 from pyspark sql import functions as F d 100 1 23 10 100 2 45 11 100 3 67 12 100 4 78 13 10
  • CSS 样式表范围仅限于单个 svg 标签

    我有一个包含两个或多个 SVG 标签的网页 每个 SVG 标签都包含一个样式标签块 其中包含给定 SVG 元素的 CSS 样式 不幸的是 这些样式表似乎渗透到了全局样式中 例如 在第一个 SVG 元素上设置类 x1 的样式将导致第二个 SV
  • 从给定的二分图中查找所有最大完全二分子图

    给定一个二分图 我们想要列出所有最大完全二分子图 例如 顶点集 L A B C D 顶点集 R a b c d e 边 A a A b B a B b C c C d D c D d D e 最大完全二部为 A B a b C D c d
  • 如何让我的角色在按住跳跃时不飞

    我正在用 javascript 制作游戏 现在 当按住跳跃时 我的角色会不断跳跃 我希望他不要一直跳来跳去 即使保持跳跃 我怎样才能让他停止跳跃并在大约 2 秒后下降 我有重力 我放手后他就下来了 但我希望他自己下来 Player impo
  • 如何在标准 SQL 中将纪元时间戳转换为日期

    当我环顾四周时 我没有找到任何简单的答案 所以我想我会把它放在这里 以防有人遇到和我一样的问题 这本来是一个小问题 我正在将 ReDash 分析与 Google 的 BigQuery 结合使用 并且已打开标准SQL https cloud
  • 在 C#/.Net 中实现 SSH 服务器

    我们正在开发的一个项目刚刚添加了一个新要求 它必须能够使用密钥 对身份验证通过 SFTP SSH 接收文件 我们已经找到了一个有趣的 SSH 集合client库 例如 SSH Net 但没有服务器库 到目前为止 我们发现的最接近的是一个 P
  • 图像处理 - 将一张图像的曲线与另一张图像进行匹配

    我正在做类似这个问题的事情 将曲线图案与图像边缘匹配 https stackoverflow com questions 11729699 matching a curve pattern to the edges of an image
  • 如何配置 boost 日志,以进行旋转和追加写入?

    如何配置 boost 日志 以进行旋转和追加写入 并且重新启动程序后 不要清除日志文件 int init log typedef sinks synchronous sink lt sinks text file backend gt fi
  • 自定义 Lambda 排序扩展

    我想使用我的自定义扩展方法来订购对象列表 它只是一个示例 因此它使用冒泡排序 我目前的状态 public static IOrderedQueryable
  • LINQ To Entities 包含不区分大小写的搜索

    我正在尝试在 linq toEntity 中像这样查询我的结果集 var categoriesList catRepo GetAllCategories filteredCategories categoriesList Where c g
  • 在 R 中绘制带有颜色和频率的混淆矩阵

    我想绘制一个混淆矩阵 但是 我不想只使用热图 因为我认为它们的数值分辨率很差 相反 我还想绘制正方形中间的频率 例如 我喜欢这样的输出 library mlearning data Glass package mlbench Glass T
  • 如何从文件内容创建 Java 字符串?

    我使用下面这个习语已经有一段时间了 它似乎是最广泛的 至少在我访问过的网站上是这样 有没有更好 不同的方法在 Java 中将文件读入字符串 private String readFile String file throws IOExcep
  • 使用命令提示符复制文件夹并重命名它

    我正在尝试复制一个文件夹并将其粘贴到从中复制的同一目录中 例如 C Test 是由文件夹 ACDM 组成的主目录 我想将 ACDM 复制到同一目录中并将新文件夹重命名为 ACDM1 其中包含与 ACDM 相同的所有文件 我想使用命令提示符来
  • 当表仅包含一行时 StDev() 函数返回 Null

    我正在尝试使用 StDev 函数 但得到空白结果 我用它作为 SELECT StDev fldMean FROM myTable 其中 fldMean 包含值 2 3 并且应计算为 0 但我只是得到一个空结果 我似乎无法理解如何在函数中使用
  • 如何在 ruby​​ 中批量重命名文件

    我一直在尝试编写一个基于ruby的文件重命名程序 作为自己的编程练习 我知道linux下有rename 但我想学习Ruby 而rename在Mac上不可用 从下面的代码来看 问题在于 include 即使我看到文件名包含这样的搜索模式 方法
  • 消除双向递归关系的最简单方法?

    我用Gson http code google com p google gson 将 Java 对象转换为 Json 响应的库 问题是 在 JPA 请求后 由于与其他实体的递归关系 无法转换从 DB 检索的对象 看我之前的问题 https