저는 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에서 계절을 잡을 수없는 이유가 확실치 않습니다. 분명히 있습니다. 어떤 도움이라도 대단히 감사합니다!