Java 使用反射更新JPA实体不起作用?

Java 使用反射更新JPA实体不起作用?,java,reflection,jpa,Java,Reflection,Jpa,我有一个实体,看起来像这样:(我正在为网页编码,所以我为任何错误道歉) 我尝试使用反射操作它: Long id = 1; Entity entity = myDao.getEntity(id); entity.setField("set directly"); Field[] fields = entity.getClass().getDeclaredFields(); for (Field f : fields) { if (f.getName().equals("field"

我有一个实体,看起来像这样:(我正在为网页编码,所以我为任何错误道歉)

我尝试使用反射操作它:

Long id = 1;

Entity entity = myDao.getEntity(id);

entity.setField("set directly");

Field[] fields = entity.getClass().getDeclaredFields();

for (Field f : fields) {
    if (f.getName().equals("field")) {
        f.setAccessible(true);
        f.set(entity, "set using reflection");
        f.setAccessible(false);
    }
}

System.out.println(entity.getField());
此程序打印“使用反射设置”。但是,在数据库中,使用反射设置的值不会得到更新:

SELECT * FROM ENTITY WHERE ID = 1
ID     FIELD
1      set directly
这很奇怪。我可以发誓这曾经奏效,但现在不行了。是否真的无法使用反射操作实体


如果有必要的话,我将使用EclipseLink 1.1.1。

您的类可能会被检测,而setter负责记录更改。我不熟悉EclipseLink来检查
myDao.getEntity(id)返回的类是否正确
是EclipseLink生成的子类的实际类。

我很确定持久性框架给您的实体实际上包装在另一个类中(可能与通过反射附加的内容相同)。通过反射直接改变场似乎不太可能奏效。您可能需要检查是否有(生成的)setter可以使用。尽管如果您选择这种方式,人们可能会问,为什么不允许调用者直接调用setter?

通过反射更改实体类的值将充满问题。这是因为您要处理的类是持久性的,因此持久性API需要了解字段的更改

如果您通过反射进行更改,持久化API很可能不知道这些更改


一个更好的解决方案是通过反射调用setter。

好问题!原因是,我试图使用我在这篇文章中接受的答案来比较和更新我的实体:我不确定您的设计是否非常合理,但是如果EclipseLink修改类并添加setter,那么找到它们应该很简单,因为它们可能会遵循POJO约定(setter for field是setField()),谢谢,现在它起作用了。我通过反思给二传手和传接手打电话。我认为当EclipseLink的静态编织被打开时,原始代码被破坏了,因为我确信操作直接用于工作的字段。然而,现在一切都很好。
SELECT * FROM ENTITY WHERE ID = 1
ID     FIELD
1      set directly