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

时间:2009-07-07 12:51:47

标签: java reflection jpa

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

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

    // Insert getters and setters here...
}

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

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。

3 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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