我的目标之一是创建一个引擎,该引擎将使用反射动态地从JPA对象设置pojo对象中的值。其中一个匹配标准是,字段名称应匹配。
我成功地为两个pojo对象实现了这个功能。但是当我尝试使用JPA对象作为对象参数之一时,它不起作用。根据我的研究,我发现方法Class.getDeclaredFields()
并没有给我字段的名称,而是JPA对象的成员变量的getter / setter方法名称。
任何人都可以给我一个指导或方向,我应该在哪里/应该完成这项任务?
答案 0 :(得分:2)
JPA提供程序通常会使用具体JPA类的dynamic proxy classes,因此您无法保证代理中的字段名称。关于代理的唯一保证是方法是相同的。使用调试器检查您尝试使用的JPA类实例的运行时类,您将看到问题。
您可以做的最好的事情是使用反射来调用JPA返回的对象上的方法。
除此之外,我真的不明白为什么你需要POJO-ify实体类,因为实体主要是注释的...... POJO。
答案 1 :(得分:0)
其中一个匹配条件是,字段名称应匹配。
我认为这是你问题的根源。无法保证Java对象的字段名称将与getter和setter的名称相匹配......或其他任何内容。如果你做出这个假设,你将遇到无效的情况。
最好的解决方案是不使用这种方法。要求Pojo类符合JavaBeans规范并依赖setter来设置属性。这可能比对(私人)字段名称做出更多的假设。
事实上,使用动态代理实现的通用JPA对象的状态很可能保存在哈希映射中。你可以看到的那些字段可能只是用于其他东西的常量。