Updating JPA entity with reflection does not work?

java, jpa, reflection

Solution

Changing values of an entity class by reflection is going to fraught with issues. This is because you're dealing with a class which is persistent and thus the persistence API needs to know about changes to the fields.

If you make changes via reflection, chances are the persistence API will not know about those changes.

A better solution would be to call the setters via reflection.

Problem

I have an entity which looks something like this: (I'm coding to the web page so I apologize for any mistakes) ``` @Entity public class Entity { @Id private Long id; private String field; // Insert getters and setters here... } ``` I try to manipulate it using reflection: ``` 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()); ``` This program prints "set using reflection". However, in the database the value set using reflection does not get updated: ``` SELECT * FROM ENTITY WHERE ID = 1 ID FIELD 1 set directly ``` This is strange. I could swear that this used to work - but now it isn't. Is it really so that you cannot manipulate entities using reflection? I'm using EclipseLink 1.1.1 if that matters.

Original source

Related problems