2009-07-07 4 views
3

나는 이런 식으로 보이는 엔티티가있다 : (나는 실수를 사과한다. 그래서 나는 실수를 사과한다.)리플렉션으로 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을 사용하고 있습니다.

답변

5

리플렉션을 통해 엔티티 클래스 값을 변경하면 많은 문제가 발생할 수 있습니다. 이것은 당신이 영속적 인 클래스를 다루고 있기 때문에 영속성 API가 필드의 변화를 알아야하기 때문입니다.

리플렉션을 통해 변경 한 경우 API가 변경 사항을 알지 못하는 경우가 있습니다.

더 좋은 해결책은 설정 도구를 리플렉션을 통해 호출하는 것입니다.

+0

감사합니다. 이제 작동합니다. 리터를 통해 세터와 게터를 호출합니다. EclipseLink의 정적 제직 기능이 켜져있을 때 원래 코드가 파손 된 것으로 생각합니다. 작동하는 데 직접 사용 된 필드를 조작했기 때문입니다. 그러나 이제는 모두 잘되었습니다. – tputkonen

0

클래스가 계측되고 기록 책임자가 변경 될 수 있습니다. 나는 myDao.getEntity(id);에 의해 리턴 된 클래스가 EclipseLink에 의해 생성 된 서브 클래스의 실제 클래스인지 점검하기 위해 EclipseLink에 익숙하지 않다.

1

퍼시스턴스 프레임 워크에서 제공 한 엔티티가 실제로 다른 클래스에 래핑 된 것입니다 (리플렉션을 통해 처리 된 것과 동일한 것일 수도 있음). 반사를 통해 필드를 직접 변경하는 것은 효과가 없을 것 같습니다. 사용할 수있는 (생성 된) setter가 있는지 확인할 수 있습니다. 그 길로 가면 발신자가 세터를 직접 호출하지 못하게하는 이유가 있습니다.

+0

좋은 질문입니다! 그 이유는 내가이 엔터티에서 허용 한 대답과 같은 것을 사용하여 항목을 비교하고 업데이트하려고하기 때문입니다. http://stackoverflow.com/questions/867442/what-is-the-best-way-to -compare-several-javabean-properties – tputkonen

+0

당신의 디자인이 매우 제멋대로인지는 모르겠지만, EclipseLink가 클래스를 수정하고 세터를 추가하는 경우 POJO 규칙을 따르기 때문에 쉽게 찾을 수 있어야합니다 (setter 필드는 setField입니다.()) – wds

+0

Michael에게 의견보기 – tputkonen

관련 문제