Java 关于解决JPA持久性问题的建议

Java 关于解决JPA持久性问题的建议,java,jpa,persistence,foreign-key-relationship,Java,Jpa,Persistence,Foreign Key Relationship,我正在构建一个持久性测试仪。此项目负责创建和填充(使用随机值)我可能拥有的任何其他对象。对象(obj1)被持久化到数据库中,然后从中读取并存储(obj2),然后我将比较它们(obj1==obj2)。测试数据是否正确持久化。(到目前为止,对于简单对象,这已经在起作用) 然而,由于我用随机值填充所有对象,我有一个问题,因为id是随机的。。。 这使得它无法持久,因为FK与任何id都不对应 为了解决这个问题,我考虑为每个对象(有很多对象)建立一个工厂,并保存id,以便以后在持久化时,我可以得到id值并相

我正在构建一个持久性测试仪。此项目负责创建和填充(使用随机值)我可能拥有的任何其他对象。对象(obj1)被持久化到数据库中,然后从中读取并存储(obj2),然后我将比较它们(obj1==obj2)。测试数据是否正确持久化。(到目前为止,对于简单对象,这已经在起作用)

然而,由于我用随机值填充所有对象,我有一个问题,因为id是随机的。。。 这使得它无法持久,因为FK与任何id都不对应

为了解决这个问题,我考虑为每个对象(有很多对象)建立一个工厂,并保存id,以便以后在持久化时,我可以得到id值并相应地使用它。但我不能保证这会奏效,你们这么认为

你们有过这样的问题吗?你是怎么解决的?你还有其他建议吗?他们非常感激


谢谢

TL;DR:作为第一种方法,我将处理一个文本描述,将您需要的数据符合的任何依赖性约束转换为测试脚本或脚本驱动数据。然后按要求的顺序生成数据

“测试”似乎是一个示例持久性api客户机:它有一个基于某种语言声明的运行时状态,您可以用这种语言调用持久性api;它模拟典型客户端的多个持久性调用。典型api客户机的这种运行时状态可能涉及对象之间的任何依赖关系。因为您实际上引用了FKs,所以您正在模拟的客户机至少有一部分状态与ORM有关

这些ORM声明涉及FK和其他约束。您可能有相同信息的另一个描述,如数据库DDL或数据库运行时元数据,这些描述由这些声明生成或生成。也许这些信息实际上是持久性api的一部分。你没说清楚。用于信息的DBMS表单更可能具有明确的依赖关系

处理声明或DDL或元数据查询输出文本以提取相关声明部分。如awk、sed、grep。生成一个依赖关系图,其中节点是对象类+字段对,有向边是依赖类+字段对。(FK是类+字段集到类+字段集,但键可能重叠,因此依赖单元为字段。)查找这些项的偏序。您可以将边放入数据库表中,并执行传递闭包和/或偏序查询。或者你可以找一个图书馆来做这件事。(如JGraphT库)声明可能已经被要求按照这样的顺序进行。按增加依赖性的顺序生成数据。您可以重复生成依赖对象组,然后重新开始。当然,这一切都应该是自动化的

(更一般地说:在一个ORM表中,一组对象构成一个表示有序列表的树,其中有一个从下一个字段到OID字段的FK。但这只是整体约束的一小部分(称为表示不变量)如果您遵循所有后续引用,它们将形成一棵树!可能是一棵排序树或平衡树!当walk生成一个有序列表时!由构建树的调用描述的列表!可能您的持久性测试仪需求说明了您的测试客户机数据/对象/状态应具有的属性的种类。可能只是ORMish的东西.例如PKs,UNIQUE,FKs,through:。可能只是FKs。)

(请确保设置测试项目,以便可以对api和测试仪进行回归测试。例如,存储种子。尽管您可能无法存储所有示例生成的数据,但您可以对其进行总和检查,并将其与表中的部分进行比较,以便检查其是否可能与以前的情况相同。)


(当心随机测试数据。了解预期的输入输出关系。我参与了一个项目,使用随机测试数据发现了一个数百万美元的bug(不是我的!)。

是否可以不使用随机值填充ID,而是按顺序填充ID?它能解决问题吗?我已经解决了。不行,这是个复杂的问题,哈哈