2012-08-03 26 views
0

我的目标之一是创建一个引擎,它将使用反射动态地从JPA对象中设置pojo对象中的值。匹配标准之一是,字段名称应该匹配。如何使用反射从JPA对象检索私有变量属性

我成功地实现了这两个pojo对象。但是,当我尝试使用JPA对象作为对象参数之一时,它不起作用。根据我的研究,我发现方法Class.getDeclaredFields()不会给我该字段的名称,而是给出JPA对象的成员变量的getter/setter方法名称。

任何人都可以请给我一个领导或方向,在哪里/我应该看什么来完成这项任务?

回答

2

JPA提供程序通常会使用具体JPA类的dynamic proxy classes,因此您无法保证代理中的字段名称。关于代理的唯一保证是方法是相同的。使用调试器来检查您尝试使用的JPA类实例的运行时类,您将看到问题。

您可以做的最好的事情就是使用反射来调用JPA返回对象上的方法。


所有这一切不谈,我真的不明白你为什么会需要反正POJO的IFY的实体类,因为实体主要是一个注释... POJO。

+0

感谢马特工作。我们必须创建pojo -DTO类的原因是为了解耦我们的领域模型对象上的客户端依赖关系。 – kcoder 2012-08-06 17:33:36

+0

太棒了!如果我的答案解决了您的问题,您是否介意[接受它?](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)谢谢。 – 2012-08-06 17:39:27

0

其中一个匹配标准是字段名称应该匹配。

我认为这是你问题的根源。无法保证Java对象的字段名称将与getter和setter的名称匹配......或其他任何内容。如果你做出这个假设,你会遇到不能正常工作的情况。

最好的解决办法就是不要使用这种方法。要求Pojo类符合JavaBeans规范并依赖setter来设置属性。这比起对(私人)字段名称的假设可能更常见。


事实上,使用动态代理很可能在哈希映射举行的通用JPA对象的状态来实现。你可以看到的那些字段可以简单地作为用于别的东西的常量。

+0

感谢大家后来的帮助,我发现了一些与我想实现的内容非常相似的东西http://dozer.sourceforge.net/documentation/about.html – kcoder 2012-08-09 20:35:11