구현을 소유되지 않은 관계 Google App Engine
-
10-07-2019 - |
문제
나의 질문은 이상의 모범 사례에 대한 질문을 구현하는 방법을 소유하지 않은 관계로 Google App Engine.내가 사용하 JDO 하는 지속성과 같이 추천 google 문서 나도 유지의 소유되지 않은 관계는 다음과 같이
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class User implements Serializable, UserDetails {
...
@Persistent
private List<Key> groups;
...
}
이제 내가 나가는 내 처지에 갔을 때는 쿼리를 개체 목록을 사용하여 그들은 키체입니다.그래서 때 나는 내 목록 그룹의 키기 위해서는 실제로 목록을 반환의 그룹 개체 내가 보기에 그 열쇠를 얻을 개체입니다.나의 질문은 무엇입의 추천 방법을 소유하지 않은 모양까지 모델에는 것은 어떨까요?
가 있어야의 인스턴스 PersistanceManagerFactory 에서 모체 그래서 내가 할 수 있는 조회?
가 있어야 인스턴스의 내 GroupDAO 개체 내에서 모체 그래서 내가 할 수 있는 모습까?
해야 하는 유틸리티를 이 유형의 조회?
나는 새로운 이 그래서 나는 단지 알고 싶은 가장 좋은 방법입니다.감사합니다.
해결책
이상적으로, User
체 있는 방법을 반환하는 List<UnownedObject>
도록 호출자가 깨끗한 API 를 사용합니다.하는 방법 중 하나이 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();
}
}
}
할 수 있습니다 다음 주입 PersistenceManager
귀하의 DAO.당신이 사용하는 경우 쥬스와 당신은 할 수 있습니다:
@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
그래서 User.setUserDao()
할 수 있 패키지 범위가 있습니다.을 결정할 수 있습 설정 PersistenceManager
로 User
체 대신 UserDao
.
다음을 만들어야 합 쥬스와 모듈을 바인딩 PersistenceManager
:
public class PersistenceManagerModule extends AbstractModule {
@Override
protected void configure() {
}
@Provides @RequestScoped
PersistenceManager providePersistenceManager(HttpServletRequest request) {
return (PersistenceManager) request.getAttribute("pm");
}
}
마지막으로 당신을 구성해야 Google App Engine 사용하는 쥬스와.
이것은 하나의 가능한 방법으로 그것을 할 수 있습니다.당신이 될 수 있는 더 똑똑했다 providePersistenceManager
성 PersistenceManager
로 저장 요구 특성에 대 servlet 필터를 만들기 PersistenceManager
(필터는 아직도 닫).당신은 또한 servlet 필터를 얻을 쥬스와 인젝터 피할 수 있도록 사용 setAttribute()
고 getAttribute()
고 대신 사용하여 더 유형-안전 API 를 사용합니다.
다른 팁
Google 추천합니다 싱글 톤 peristencemanagerFactory 만들기. 나는 당신의 모델에 PMF를 고수하지 않을 것입니다.