- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试将 Morphia 用作我使用 Java EE 创建的 Web 服务的一部分。
我阅读了关于 DAO 支持的吗啡文档,其中写道:
In a web application environment, we would probably use a dependency injection framework (like Guice or Spring) to inject the dependencies into the DAO, and then inject the DAO into a controller, so the controller would never directly deal with the gritty details.
因此,我有一个标有 @Stateless
注释的 EJB(以便我可以在需要时注入(inject)),它扩展了 morhpia 提供的 BasicDAO
,如下所示:
@Stateless
public class PlayerDAO extends BasicDAO<Player, ObjectId>{
@EJB
ConnectionFactory factory;
public PlayerDAO(){};
public PlayerDAO(Morphia morphia, MongoClient mongo){
super(mongo, morphia, "testdb");
}
}
我的问题是我需要提供采用 Morphia
和 MongoClient
参数并调用 super
构造函数的构造函数,这意味着我还需要提供一个无参数构造函数来满足 Java EE 的要求。
当我添加此构造函数时,NetBeans 显示错误:
public PlayerDAO(){};
constructor BasicDAO.BasicDAO(Datastore) is not applicable
(actual and formal argument lists differ in length)
constructor BasicDAO.BasicDAO(MongoClient,Morphia,String) is not applicable
(actual and formal argument lists differ in length)
constructor BasicDAO.BasicDAO(Class,Datastore) is not applicable
(actual and formal argument lists differ in length)
constructor BasicDAO.BasicDAO(Class,MongoClient,Morphia,String) is not applicable
(actual and formal argument lists differ in length)
有没有办法解决这个问题,或者我应该采取不同的方法来使用 MongoDB 作为 java ee web 服务的一部分?
最佳答案
这就是我们所做的,效果很好。下面的实现仅是 CDI(部署到 Tomcat),但也适用于 @Stateless
beans。我们让 Mongo
和 Morphia
由工厂进行 @Produce
处理。 @QConfig
带注释的名称由生产者生成,该生产者从包含 MongoDB 数据库名称的类路径读取 .properties
文件。
public interface EntityDao<T, K> {
T findById(K id);
K save(T object);
T update(T object); // returns an up-to-date version of the entity
}
public class BaseDaoMorphiaImpl<T extends BaseEntity, K>
implements EntityDao<T, K>, Serializable {
@Inject
private @QConfig String mongoDbName;
@Inject
private @QMongo Instance<Mongo> mongo;
@Inject
private @QMorphia Instance<Morphia> morphia;
// BasicDAO is not serializeable; always use wrapper getBasicDao()
private transient BasicDAO<T, K> basicDao;
private Class clazz;
public BaseDaoMorphiaImpl(Class clazz) {
this.clazz = clazz;
}
@PostConstruct
public void init() {
setupBasicDao();
}
protected BasicDAO<T, K> getBasicDao() {
if (basicDao == null)
setupBasicDao();
return basicDao;
}
private void setupBasicDao() {
basicDao = new BasicDAO<T, K>(clazz, mongo.get(), morphia.get(), mongoDbName);
basicDao.ensureIndexes();
}
@Override
public T findById(K id) {
return getBasicDao().get(id);
}
@Override
public K save(T o) {
Key<T> key = getBasicDao().save(o);
return (K) key.getId();
}
@Override
public T update(T o) {
return findById((K) o.getId());
}
protected QueryResults<T> find( Query<T> query ) {
return getBasicDao().find(query);
}
protected T findOne( Query<T> query ) {
return getBasicDao().findOne(query);
}
protected Query<T> createQuery() {
return getBasicDao().getDatastore().createQuery(clazz);
}
}
示例:
public interface UserDao extends EntityDao<User, ObjectId> {
User findByEmail( String email );
User findByName( String name );
List<User> findAll();
}
public class UserDaoMorphiaImpl extends BaseDaoMorphiaImpl<User, ObjectId> implements UserDao {
@Inject
private Logger logger;
public UserDaoMorphiaImpl() {
super(User.class);
}
@Override
public User findByEmail(String email) {
Datastore ds = getBasicDao().getDatastore();
User res = ds.find(User.class).filter("email = ", email).get();
return res;
}
@Override
public User findByName(String name) {
Datastore ds = getBasicDao().getDatastore();
User res = ds.find(User.class).filter("name = ", name).get();
return res;
}
@Override
public List<User> findAll() {
return getBasicDao().find().asList();
}
@Override
public ObjectId save(User user) {
return super.save(user);
}
}
对于更具体的查询,您可以使用如下内容:
@Override
public Iterator<Document> fetchNewest( int start, int count ) {
return find(createQuery().order("-uploadDate").offset(start).limit(count)).iterator();
}
关于java - 将 Morphia 与 Java EE 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26123606/
如何使用 Morphia 查询最新插入的项目 以及如何获得集合的大小? 最佳答案 这取决于你说的最新是什么意思,但如果你有一个带有创建日期的日期字段,那么你可以这样做: T latest = ds.f
在我现在的初始化代码中,我创建了 1 个 Morphia 实例并使用它来映射所有数据库中的所有类。我注意到,当我调用 ensureIndexes() 时,它将初始化一个空集合并为所有数据库中的所有集合
我是新手,所以开始吧。 试图从 MongoDb 中获取名为“Bob”的用户。 我有: UserData ud = MonConMan.instance().getDb().find(UserData.
长话短说:是否可以使用 Morphia 为第三方库类编写类型转换器? 长话短说:我是 Morphia 的新手。我有一个实体类,其中包含一个类型为 javax.activation.MimeType 的
长话短说:是否可以使用 Morphia 为第 3 方库类编写类型转换器? 长话短说:我是 Morphia 的新手。我有一个实体类,其中包含类型为 javax.activation.MimeType 的
我有一个名为 Project 的 Java 类,其 users ArrayList包含用户对象的属性。 我的项目集合看起来像 [ { "_id" : ObjectId("56410150d
所以这就是导致问题的问题...... 我使用 MongoDB 数据库在 jBoss 上运行这个 javaEE 应用程序。我使用Morphia与mongo进行通信...该应用程序具有以下基本程序组件;
我编写了一个代码,其中包含套件信息,其中嵌入了测试用例信息。我编写了 TestCase.java 和 Suite.java,它们似乎没有错误。但是使用我编写的 MongoMapper.java 我我收
com.google.code.morphia:morphia:jar:1.00-SNAPSHOT 的 POM 丢失,没有可用的依赖信息 scm:svn:svn://morphia.googl
不确定这是否可行,但可以了。 我有一个 MongoDB(使用 morphia 来访问它),其表如下所示(本示例进行了简化,但概念是相同的): { Name : "Robert", NickNames
我对 Morphia 还很陌生。有没有一种简单的方法可以进行求和、平均值、最大值、最小值等操作? 我已经看到了一些“Play”插件,但我不确定它是如何工作的,我想使用普通的 Morphia。 最佳答案
我试图了解如何使用 Morphia 正确注释基类和扩展类。给定以下示例,我应该 @Entity 到 Employee 类还是只是 Developer 类? public abstract class
我想使用 Morphia 将对象存储到 MongoDB。 但是我遇到了很多异常(exception): Exception in thread "main" java.lang.IllegalArgu
我有一个像这样的简单文档: @Entity("users") @Indexes(@Index(fields = {@Field("lastName"), @Field("firstName")}))
在我的Java方法中,我想将一个像这样的复杂查询作为参数传递给我的 MongoDB 集合: {"$or": [{"$and": [{"contextID": "AKKA"}, {"messageID"
Morphia 中以下 Mongo 查询的等价物是什么? db.events.find({ "date": { $gte: ISODate("2001-01-01") , $lt: ISODate("
为了模拟我看到的行为,我编写了这个测试(给出了完全相同的错误): @Test public void testListGenerics() { @Entity class BaseOn
我有一个嵌入式实体列表: @Embedded private List embedded = new ArrayList(); 在此列表中,我想搜索任何具有特定属性(我们称它为 foo)但不是另一个(
我是新手, 假设我有集合“UserData”并且 UserData 中有 1000 个文档。 现在我需要再添加一个名为“position”的字段。 我可以这样做吗?怎么做?或者它是如何工作的? 查看维
使用吗啡,java play 来完成作业。 我有 2 个馆藏,一个部门馆藏和代理馆藏。一个部门有很多代理人。部门类有一个带有注释@Reference 的List。 当我删除代理并尝试获取代理所在的部门
我是一名优秀的程序员,十分优秀!