Glassfish 如何使EntityManager可注射?

Glassfish 如何使EntityManager可注射?,glassfish,nosql,java-ee-6,code-injection,entitymanager,Glassfish,Nosql,Java Ee 6,Code Injection,Entitymanager,我有以下代码: MonsterEJB.java: package model; import java.util.List; import javax.ejb.LocalBean; import javax.ejb.Stateless; import javax.inject.Inject; import javax.inject.Named; import javax.persistence.EntityManager; import javax.persistence.EntityMan

我有以下代码:

MonsterEJB.java:

package model;

import java.util.List;

import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.inject.Named;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceUnit;
import javax.persistence.Query;

@Stateless
@LocalBean
@Named
public class MonsterEJB 
{
    @PersistenceUnit(unitName="mongo")
    private EntityManager em;

    @Inject
    private Monster injectableMonster;

    public MonsterEJB() 
    {

    }

    public void create() 
    {
        em.getTransaction().begin();
        Monster en = new Monster();
        en.setDescription(injectableMonster.getDescription());
        em.persist(en);
        em.getTransaction().commit();
    }

    public List<Monster> getList() 
    {
        Query query = em.createQuery("Select m from Monster m");
        List<Monster> Monsters = query.getResultList();

        return Monsters;
    }

    public void remove()
    {
        em.getTransaction().begin();
        Monster en = em.find(Monster.class, injectableMonster.getId());
        em.remove(en);
        em.getTransaction().commit();
    }

    public void update() 
    {
        em.getTransaction().begin();
        Monster en = em.find(Monster.class, injectableMonster.getId());
        en.setDescription(injectableMonster.getDescription());
        em.getTransaction().commit();
    }
}
package model;

import java.io.Serializable;

import javax.enterprise.context.RequestScoped;
import javax.inject.Named;
import javax.persistence.*;

import org.eclipse.persistence.nosql.annotations.*;

@Entity
@Named
@RequestScoped
@NoSql(dataFormat = DataFormatType.MAPPED)
public class Monster implements Serializable 
{
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue
    @Field(name = "_id")
    private String id;

    @Version
    private long version;

    @Basic
    private String description;

    public Monster() 
    {

    }

    public String getId() 
    {
        return id;
    }

    public void setId(String id) 
    {
        this.id = id;
    }

    public String getDescription() 
    {
        return description;
    }

    public void setDescription(String description) 
    {
        this.description = description;
    }

    @Override
    public String toString() 
    {
        return "Monster [id=" + id + ", version=" + version + ", description="+ description;
    }
}
<?xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
        version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
    <persistence-unit name="mongo" transaction-type="RESOURCE_LOCAL">
        <class>model.Monster</class>
        <properties>
            <property name="eclipselink.target-database" value="org.eclipse.persistence.nosql.adapters.mongo.MongoPlatform"/>
            <property name="eclipselink.nosql.connection-spec" value="org.eclipse.persistence.nosql.adapters.mongo.MongoConnectionSpec"/>
            <property name="eclipselink.nosql.property.mongo.port" value="27017"/>
            <property name="eclipselink.nosql.property.mongo.host" value="localhost"/>
            <property name="eclipselink.nosql.property.mongo.db" value="MonsterDatabase"/>
            <property name="eclipselink.logging.level" value="FINEST"/>
        </properties>
    </persistence-unit>
</persistence>
persistence.xml:

package model;

import java.util.List;

import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.inject.Named;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceUnit;
import javax.persistence.Query;

@Stateless
@LocalBean
@Named
public class MonsterEJB 
{
    @PersistenceUnit(unitName="mongo")
    private EntityManager em;

    @Inject
    private Monster injectableMonster;

    public MonsterEJB() 
    {

    }

    public void create() 
    {
        em.getTransaction().begin();
        Monster en = new Monster();
        en.setDescription(injectableMonster.getDescription());
        em.persist(en);
        em.getTransaction().commit();
    }

    public List<Monster> getList() 
    {
        Query query = em.createQuery("Select m from Monster m");
        List<Monster> Monsters = query.getResultList();

        return Monsters;
    }

    public void remove()
    {
        em.getTransaction().begin();
        Monster en = em.find(Monster.class, injectableMonster.getId());
        em.remove(en);
        em.getTransaction().commit();
    }

    public void update() 
    {
        em.getTransaction().begin();
        Monster en = em.find(Monster.class, injectableMonster.getId());
        en.setDescription(injectableMonster.getDescription());
        em.getTransaction().commit();
    }
}
package model;

import java.io.Serializable;

import javax.enterprise.context.RequestScoped;
import javax.inject.Named;
import javax.persistence.*;

import org.eclipse.persistence.nosql.annotations.*;

@Entity
@Named
@RequestScoped
@NoSql(dataFormat = DataFormatType.MAPPED)
public class Monster implements Serializable 
{
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue
    @Field(name = "_id")
    private String id;

    @Version
    private long version;

    @Basic
    private String description;

    public Monster() 
    {

    }

    public String getId() 
    {
        return id;
    }

    public void setId(String id) 
    {
        this.id = id;
    }

    public String getDescription() 
    {
        return description;
    }

    public void setDescription(String description) 
    {
        this.description = description;
    }

    @Override
    public String toString() 
    {
        return "Monster [id=" + id + ", version=" + version + ", description="+ description;
    }
}
<?xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
        version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
    <persistence-unit name="mongo" transaction-type="RESOURCE_LOCAL">
        <class>model.Monster</class>
        <properties>
            <property name="eclipselink.target-database" value="org.eclipse.persistence.nosql.adapters.mongo.MongoPlatform"/>
            <property name="eclipselink.nosql.connection-spec" value="org.eclipse.persistence.nosql.adapters.mongo.MongoConnectionSpec"/>
            <property name="eclipselink.nosql.property.mongo.port" value="27017"/>
            <property name="eclipselink.nosql.property.mongo.host" value="localhost"/>
            <property name="eclipselink.nosql.property.mongo.db" value="MonsterDatabase"/>
            <property name="eclipselink.logging.level" value="FINEST"/>
        </properties>
    </persistence-unit>
</persistence>
问题:
如何让我的MonsterEJB.java使用NoSQL注入EntityManager?

我不确定这是否正是导致异常的原因,但是您的
MonsterEJB
类同时被注释为
@Named
@Stateless
@Named
用于定义
JSF管理Bean
,而
@Stateless
用于
enterprisejavabean
,它们是不同的东西

使用一个或另一个注释

此外,
Monster
类同时被定义为:一个
实体
,一个通过
@命名
注释管理的
bean,以及一个通过
javax.enterprise.context.RequestScoped
注释管理的CDIBean。这也没有道理


我建议学习一些Java EE 6教程(如),以澄清这些概念。

我不确定这是否正是您异常的原因,但是您的
MonsterEJB
类同时被注释为
@Named
@Stateless
@Named
用于定义
JSF管理Bean
,而
@Stateless
用于
enterprisejavabean
,它们是不同的东西

使用一个或另一个注释

此外,
Monster
类同时被定义为:一个
实体
,一个通过
@命名
注释管理的
bean,以及一个通过
javax.enterprise.context.RequestScoped
注释管理的CDIBean。这也没有道理


我建议学习一些Java EE 6教程(比如)来澄清这些概念。

尝试使用@PersistenceContext而不是@PersistenceUnit

尝试使用@PersistenceContext而不是@PersistenceUnit

那么Monster.Java和MonsterEJB应该如何正确注释呢?我在JavaEE6应用程序中使用java服务器面。给我的印象是,我需要它才能正常工作。在你学习了一个教程之后,你可以实现Adam Bien的博客中的这个,如果你想要更完整的东西,那么是一个使用JPA和其他Java EE 6功能的完整web应用程序……那么Monster.Java和MonsterEJB应该如何正确注释呢?我在JavaEE6应用程序中使用java服务器面。给我的印象是,我需要这个来正确工作。在你学习了一个教程之后,你可以实现Adam Bien的博客中的这个,如果你想要更完整的东西,那么是一个使用JPA和其他Java EE 6功能的完整web应用程序。。。