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

tpu*_*nen 4 java reflection jpa

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

@Entity
public class Entity {
    @Id
    private Long id;
    private String field;

    // Insert getters and setters here...
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用反射来操纵它:

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());
Run Code Online (Sandbox Code Playgroud)

该程序打印"使用反射设置".但是,在数据库中,使用反射设置的值不会更新:

SELECT * FROM ENTITY WHERE ID = 1
ID     FIELD
1      set directly
Run Code Online (Sandbox Code Playgroud)

这很奇怪.我可以发誓这曾经发挥作用 - 但现在却不行.难道你真的不能用反射来操纵实体吗?

如果重要的话,我正在使用EclipseLink 1.1.1.

Mic*_*les 6

通过反思改变实体类的价值将充满问题.这是因为您正在处理一个持久的类,因此持久性API需要知道字段的更改.

如果您通过反射进行更改,则持久性API可能无法了解这些更改.

更好的解决方案是通过反射调用setter.