使用reflection更新JPA实体不起作用?

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

@Entity public class Entity { @Id private Long id; private String field; // Insert getters and setters here... } 

我尝试使用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()); 

该程序打印“使用reflection设置”。 但是,在数据库中,使用reflection设置的值不会更新:

 SELECT * FROM ENTITY WHERE ID = 1 ID FIELD 1 set directly 

这很奇怪。 我可以发誓这曾经工作 – 但现在不是。 难道你不能用reflection来操纵实体吗?

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

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

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

更好的解决方案是通过reflection调用setter。

我很确定你的持久性框架给你的实体实际上包含在另一个类中(可能与通过reflection添加的东西相同)。 通过reflection直接改变场似乎不太可行。 您可能想要检查是否有可以使用的(生成的)setter。 虽然如果你走这条路线,可能会问为什么你不允许呼叫者直接呼叫设置者?

您的class级可能会被检测,负责录制更改的制定者。 我不熟悉EclipseLink来检查myDao.getEntity(id);返回的类是否存在myDao.getEntity(id); 是EclipseLink生成的子类的实际类。