2012-07-19 4 views
0

저는 Play Framework 1.2.5 및 morphia-1.2.9a 모듈을 사용하고 있습니다. 원래 모델에서 @Reference 주석을 사용하고 있었지만 @Lazy에 대해 (게으른 = true)가 작동하지 않아서 ObjectIds를 사용하여 전환해야했습니다. 재 작업 및 중복을 줄이기위한 시도로, 나는 다음과 같은 MorphiaList 만든 : 그럼 내가 사용재생 Morphia, (일반) 내장 객체의 목록 콘텐츠를 가져올 수 없습니다.

package models.morphia; 
import play.modules.morphia.Model; 
public abstract class MorphiaModel<T extends MorphiaModel<T>> extends Model implements Comparable<T>{ 
} 

:

package models.morphia; 

import java.util.ArrayList; 
import java.util.Collection; 
import java.util.Collections; 
import java.util.Iterator; 
import java.util.List; 

import models.Team; 

import org.bson.types.ObjectId; 

import com.google.code.morphia.annotations.Embedded; 
import com.google.code.morphia.annotations.Transient; 

import play.modules.morphia.Model; 
@Embedded 
public class MorphiaList<T extends MorphiaModel> implements Iterable<T>{ 
    @Embedded("ids") private List<ObjectId> modelIds; 
    @Transient List<T> models; 
    public void sort() 
    { 
     this.getAll(); 
     Collections.sort(models); 
     this.modelIds.clear(); 
     for(T t:this.models){ 
      this.modelIds.add((ObjectId)t.getId()); 
     } 
    } 
    public MorphiaList() 
    { 
     this.models = new ArrayList<T>(); 
     this.modelIds = new ArrayList<ObjectId>(); 
    } 
    public int size() 
    { 
     System.out.println(modelIds.size()); 
     return modelIds.size(); 
    } 
    public boolean add(T model) 
    { 
     return (this.models.add(model) && this.modelIds.add((ObjectId) model.getId())); 
    } 
    public boolean remove(T model) 
    { 
     return (this.models.remove(model)&&this.modelIds.remove((ObjectId) model.getId())); 
    } 
    public boolean addAll(Collection<? extends T> models) 
    { 
     for(T model: models) 
     { 
      this.models.add(model); 
      this.modelIds.add((ObjectId) model.getId()); 
     } 
     return false; 
    } 
    public List<T> getAll() 
    { 
     for(ObjectId oi: this.modelIds) 
     { 
      boolean found=false; 
      for(T model: models) 
      { 
       if(oi==model.getId()) 
       { 
        found=true; 
        break; 
       } 
      } 
      if(!found) 
       models.add(T.<T>findById(oi)); 
     } 
     return models; 
    } 
    public T get(int index) 
    { 
     ObjectId id = modelIds.get(index); 
     for(T model: models) 
     { 
      if(id == model.getId()) 
       return model; 
     } 
     return T.<T>findById(id); 
    } 
    @Override 
    public Iterator<T> iterator() { 
     return this.getModelIterator(); 
    } 
    public Iterator<T> getModelIterator() { 
     for(ObjectId oi: modelIds) 
     { 
      boolean found=false; 
      for(T model: models) 
      { 
       if(oi==model.getId()) 
       { 
        found=true; 
        break; 
       } 
      } 
      if(!found) 
       models.add(T.<T>findById(oi)); 
     } 
     return models.iterator(); 
    } 
    public boolean isEmpty() { 
     return this.modelIds.isEmpty(); 
    } 
    public boolean contains(T t) { 
     return this.modelIds.contains(t.getId()); 
    } 
} 

MorphiaModel은 간단을, 난 그냥 내가 내 목록을 정렬 할 수 Comparable를 구현하는 데 필요한 내 수업이 같은이 :

:

@Entity 
public class Organization extends Purchasable { 
@Embedded public MorphiaList<Season> seasons = new MorphiaList<Season>(); 

나는 시즌을 추가하면, 몽고는 예상 보여줍니다

{ 
"_id" : { "$oid" : "50097c147aa33c43fa8136ee"} , 
...other members... 
"seasons" : { "ids" : [ { "$oid" : "50097c147aa33c43fa8136ed"}]} , 
...other members... 
} 

계절 개체를 잡으러 갈 때 modelIds가 비어 있습니다! BSON에서 계절을 잡을 수없는 이유가 확실치 않습니다. 분명히 있습니다. 어떤 도움이라도 대단히 감사합니다!

답변

0

나는이 여러 이유로 작동시킬 수 없습니다 :

  1. 내가 데이터를 한 번 다시 객체로로드하여 MongoDB에 지속 가져올 수 없습니다, 객체는 언제나 null이 될 것입니다.
  2. 문제 # 1 후, MorphiaList를 검색 할 개인 목록을 추가했습니다. 그러나 MorphiaList에 ID를 가져온 후에 특정 컬렉션을 조회하는 방법을 알 수 없었습니다. 특히 내가 상속을 사용한다고 생각할 때 이질적인 컬렉션이 있습니다.

내 솔루션 : 나는 또한 한

@Transient public List<Season> seasons; 
private List<ObjectId> _seasons = new ArrayList(); 
@Transient private List<Season> pSeasons; 
public List<Season> getSeasons() 
{ 
    if(pSeasons==null) 
    { 
     if(_seasons.size()!=0) 
      pSeasons = Season.find().<Season>field("_id").in(_seasons).asList(); 
     else 
      pSeasons = new ArrayList(); 
    } 
    return pSeasons; 
} 

@PrePersist에게 목록을 확인하는 방법을 추가 : 여기에

@Reference public List<Season> seasons; 

: 참조의 모든 목록을 위해 나는이 재 작성 액세스 :

@PrePersist void beforeSave() 
{ 
    if(pSeasons!=null) 
    { 
     _seasons.clear(); 
     for(Season s: pSeasons) 
     { 
      _seasons.add((ObjectId)s.getId()); 
     } 
    } 
} 

beforeSave()은 코드에있는 추가 참조 목록마다 확장해야합니다. 이야기의 도덕 :

Play의 morphia 모듈을 사용하는 경우 @Reference 표기법을 사용하지 마십시오.