我有一个看起来像这样的实体:(我正在编写网页,所以我为任何错误道歉)
@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。
答案 0 :(得分:6)
通过反思改变实体类的价值将充满问题。这是因为你正在处理一个持久的类,因此持久性API需要知道对字段的更改。
如果您通过反射进行更改,则持久性API可能无法了解这些更改。
更好的解决方案是通过反射调用setter。
答案 1 :(得分:1)
我很确定你的持久性框架给你的实体实际上包含在另一个类中(可能与通过反射添加的东西相同)。通过反射直接改变场似乎不太可行。您可能想要检查是否有可以使用的(生成的)setter。虽然如果你走这条路线,可能会问为什么你不允许呼叫者直接呼叫设置者?
答案 2 :(得分:0)
您的课程可能会被检测,并且负责录制更改的制定者。我不熟悉EclipseLink来检查myDao.getEntity(id);
返回的类是否是EclipseLink生成的子类的实际类。