2009-08-03 9 views
2

제 질문은 Google App Engine과 소유되지 않은 관계를 구현하는 방법에 대한 모범 사례 문제입니다. 내 지속성을 할 JDO를 사용하고 내가과 같이 소유되지 않은 관계 내 목록을 지속하고있어 구글 문서에서 권장 좋아 : 내가 사용하여 개체의 목록을 조회 할 수 갔을 때 Unowned relationship 구현하기 Google App Engine

@PersistenceCapable(identityType = IdentityType.APPLICATION) 
public class User implements Serializable, UserDetails { 
... 

    @Persistent 
    private List<Key> groups; 
... 
} 

지금 내 처지를 건너 왔어요 그들은 키 개체입니다. 그래서 Group 객체 목록을 반환하기 위해 그룹 키 목록을 얻었을 때 객체를 얻기 위해 그 키를 조사해야합니다. 내 질문은 모델 개체에 대한 소유하지 않은 조회를 수행하는 권장 방법은 무엇입니까?

내 Model 개체에 PersistanceManagerFactory의 인스턴스가 있어야 조회가 가능합니까?

Model 객체에서 GroupDAO 객체의 인스턴스를 사용해야할까요?

이 유형의 조회를 수행해야하는 유틸리티가 있어야합니까?

저는 이것을 처음 접하므로 어떤 것을하는 것이 가장 좋은 방법인지 알고 싶습니다. 감사.

답변

1

User 개체는 호출자가 깨끗한 API를 얻을 수 있도록 List<UnownedObject>을 반환하는 메서드를 사용하는 것이 가장 이상적입니다. 이를 수행하는 한 가지 방법은 User 개체가 DAO의 인스턴스를 가지므로 DAO에게 쿼리를 수행하도록 요청할 수 있습니다.

이렇게하려면 PersistenceManager을 요청이 끝날 때까지 닫을 수 없습니다.

public class PersistenceManagerFilter implements Filter { 
    public void init(FilterConfig filterConfig) throws ServletException { 
    } 

    public void destroy() { 
    } 

    public void doFilter(ServletRequest request, ServletResponse response, 
     FilterChain chain) throws IOException, ServletException { 
    PersistenceManager pm = PMF.get().getPersistenceManager(); 
    try { 
     request.setAttribute("pm", pm); 
     chain.doFilter(request, response); 
    } finally { 
     pm.close(); 
    } 
    } 
} 

그런 다음 당신은 당신의 DAO에 PersistenceManager를 주입 할 수 있습니다 :이 작업을 수행하는 한 가지 방법은 servlet filter이 만드는 것입니다. 당신이 Guice를 사용하는 경우 당신은 할 수 있습니다 : UserDao 그래서 User.setUserDao() 패키지 범위가 될 수 User와 같은 패키지에있을 때 가장 잘 작동

@RequestScoped 
public class UserDao { 
    private final PersistenceManager pm; 

    @Inject 
    UserDao(PersistenceManager pm) { 
    this.pm = pm; 
    } 

    public User getUser(parameters) { 
    Key key = createKey(parameters); 
    User user = pm.getObjectById(User.class, key); 
    user.setUserDao(this); 
    return user; 
    } 
} 

. UserDao 대신 User 개체로 PersistenceManager을 설정할 수 있습니다.

다음 당신은 PersistenceManager을 결합하기 위해 Guice 모듈을 만들어야합니다

public class PersistenceManagerModule extends AbstractModule { 
    @Override 
    protected void configure() { 
    } 

    @Provides @RequestScoped 
    PersistenceManager providePersistenceManager(HttpServletRequest request) { 
    return (PersistenceManager) request.getAttribute("pm"); 
    } 
} 

마지막으로 당신이 Google App Engine to use Guice를 구성해야합니다.

이것은 가능한 한 가지 방법 일뿐입니다. providePersistenceManagerPersistenceManager을 생성하고 서블릿 필터가 PersistenceManager (필터가 여전히 닫을 수 있음)을 생성하는 대신 요청 속성으로 저장할 수 있다면 더 똑똑 할 수 있습니다. 서블릿 필터를 사용하여 Guice Injector를 가져와 setAttribute()getAttribute()을 사용하지 않고 더 많은 유형 안전 API를 사용할 수 있습니다.

+0

Guice의 ServletModule을 사용하는 경우, Guice가 PersistenceManagerFilter에 PersistenceManager를 삽입 할 수 있으므로 request.getAttribute()를 사용할 필요가 없기 때문에 더욱 쉽습니다. 이 경우, PersistenceManagerModule은 단지 PMF.get() – NamshubWriter

1

Google recommends 싱글 톤 PersistenceManagerFactory를 만듭니다. 나는 당신의 모델에 PMF를 붙이지 않을 것이다.

+0

그래, 내가 잘못 말했다. 나는 공장을위한 싱글 톤을 가지고 있는데, 실제로 키를 실제 그룹으로 변환하는 것이 가장 좋은 곳을 모른다. 내가 소유하고있는 물건이나 DAO에서해야한다면. – nwallman