我正在使用Play Framework 1.2.5和Morphia-1.2.9a模块。我最初在我的模型上使用@reference注释,但由于(lazy=true)不能在@reference上工作,我需要使用ObjectID进行切换。为了减少返工和冗余,我创建了以下睡眠者:
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很简单,我只需要它来实现可比,这样我就可以对列表进行排序:
package models.morphia;
import play.modules.morphia.Model;
public abstract class MorphiaModel<T extends MorphiaModel<T>> extends Model implements Comparable<T>{
}
然后我在课上这样用:
@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...
}
我无法让它工作有多种原因:
我的解决方案:对于每一个引用列表,我都重写了以下内容:
@Reference public List<Season> seasons;
@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 void beforeSave()
{
if(pSeasons!=null)
{
_seasons.clear();
for(Season s: pSeasons)
{
_seasons.add((ObjectId)s.getId());
}
}
}
是否有其他人在创建播放列表后不能访问播放列表id?
我是morphia的新手,想知道是否可以在文档中嵌入自定义对象列表,同时拥有自定义名称。 例如,
所以我用javafx制作了一个mp3播放器,它有一个,在这里我拖放歌曲,然后选择一首歌曲并按play播放,你就明白了。问题是,用我当前的代码,我不能播放两首以上歌曲的序列:/(播放选定的歌曲,播放它旁边的歌曲,然后停止)。代码如下:
我使用最新的freemarker版本2.3.23我有列表,其中包含用户对象,用户对象很简单,只包含名称属性。我的ftl文件如下所示: 我的Java代码如下所示: 错误显示如下:
我是一个非常noob的用户,我正在尝试在我的Android应用程序中播放Spotify的一些曲目。目前我正在使用kaaes API:https://github.com/kaaes/spotify-web-api-android 我正在努力从一个非常特定的播放列表和一个非常特定的用户ID中检索曲目。似乎我做不到,我找到的例子都是老的,对我没有帮助。以下是我尝试过的: 从寻呼机对象访问播放列表 它会
我没有找到任何关于这个特殊“问题”的答案。我目前使用Play framework 1.2.5和Play Morphia模块1.2.9 好了,问题来了:我有一个抽象类A(不是@Entity因为不允许)和两个继承自类A的类B和C,类A是从模型类扩展而来的。类B和C有@Entity注释。 你能帮帮我吗?(如果我用@entity(value=“xxxx”)在B和C上设置相同的集合,可能) 谢了!