使用jboss 5非ejb的Seam 2.2无法注入entityManager

时间:2011-08-30 22:22:13

标签: jboss seam pojo entitymanager

ETA解释这应该做什么。 员工必须跟踪2周的活动。

每周(tqiActivitySheetActionBean)包含7天(tqiDayActionBean)。

每天都包含当天的任务(tqiTasks)

任务一次显示一周(因此员工可以在本周和上周之间切换)。

我所做的是使用枚举迭代一周 - 创建一个tqiActivitySheetActionBeans的dataTable并迭代嵌套的dataTable中的那些。

员工需要能够在每天(在dataTable中)添加,删除和编辑任务。我将tqiTasks包装在tqiDayActionBean中以对它们进行分组。

我在Seam网站上发布了这个,但我没有得到任何叮咬,我已经尝试了所有我知道的东西和一些我不会让这个工作,但到目前为止没有快乐。 有使用EJB的Jboss 5的配置信息,没有Jboss 4。我有一个使用Jboss 5和Seam 2.2.0的爆炸WAR,而且没有EJB。我无法将entityManager注入我的动作POJO。 我尝试从web.xml中删除persistence-unit-ref-name引用,添加和删除

<transaction:entity-transaction /> 
<transaction:ejb-transaction />
来自components.xml的

标签(有和没有entity-manager =“#{entityManager}”)。当我使用其中任何一个时,该应用程序将无法加载。 使用默认值并一次硬编码一个。我仍然无法让这个工作。 我目前正在使用此配置:

的persistence.xml:

<persistence-unit name="myEmployee" transaction-type="JTA">
      <provider>org.hibernate.ejb.HibernatePersistence</provider>
      <jta-data-source>java:/myEmployeeDatasource</jta-data-source>
      <properties>
         <property name="hibernate.dialect" value="org.hibernate.dialect.OracleDialect"/>
         <property name="hibernate.hbm2ddl.auto" value="validate"/>
         <property name="hibernate.show_sql" value="true"/>
         <property name="hibernate.format_sql" value="true"/> 
         <property name="hibernate.default_schema" value="MY_PROD"/>
         <!-- Only relevant if Seam is loading the persistence unit (Java SE bootstrap) -->
         <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup"/>
<!-- this binds emf to jndi under java namespace - but only for jboss prior to 5.0 - I shouldn't need this. -->
<property name="jboss.entity.manager.factory.jndi.name" value="java:/EntityManagerFactories/myEmployee"/>
      </properties>
   </persistence-unit>

的components.xml:

<persistence:managed-persistence-context name="entityManager"
persistence-unit-jndi-name="java:/EntityManagerFactories/myEmployee"
auto-create="true"/>

这部署并正确启动,但entityManager仍为null。

我在同一个包中有一堆EntityHome类,这些类可以使用一个没有问题的entityManager。我看过的所有文档都说我应该能够注入一个entityManager,我已经按照Seam docs页面中的配置信息,Seam in Action一书和JBoss 5的Seam wiki(Seam wiki

我在ManagedPersistence类中设置了断点 - 在我想要使用它的时候看起来我有一个entityManager,将@Transactional注释添加到类和方法中。依然没有。我可以使用

获得EM
(EntityManager)Component.getInstance("entityManager")

但是我没有对底层entityBean的事务性访问,最终得到了hibernate LazyInitializationExceptions。 我已经使用Seam近一年了,我还没有让它工作。直到现在使用Component方法已经起作用了,但是我们的设置必定存在根本性的错误,我无法注入工作。 我很感激任何帮助。

用户类的ETA代码。

实体类是TQITask。 TQIDayActionBean类应该在一天内处理一组TQITasks的CRUD,TQIActivitySheetActionBean处理TQIDayActionBeans一周。

实体bean:

@Entity
@Table(name = "TQI_TASK")
@Name("tqitask")
public class TqiTask implements java.io.Serializable {

    static Logger log = Logger.getLogger(TqiTask.class);
    private Integer sysid;
    private TqiActivitySubtype tqiActivitySubtype;
    private TqiActivityType tqiActivityType;
// ... more fields, getters and setters

dayActionBean(一天任务):

@Name("tQIDayActionBean")
@Transactional(TransactionPropagationType.REQUIRED) //this is latest attempt
@Scope(ScopeType.CONVERSATION)
public class TQIDayActionBean implements Serializable {
    static Logger log = Logger.getLogger(TQIDayActionBean.class);


    @In(required=true)
    EntityManager entityManager;
//this doesn't work either
        @DataModel("tqiTasksForOneDay")
    @Out(required = false)
    private List<TqiTask> tqiTasksForOneDay;

// .... more stuff
// method that should get an entityManager
/**
     * tasks are children of tqiActivitySheet, info we need is in tqiActivitySheetV, so use peopleSoftIdSelected and weekSelected.weekSysid
     * to get the tqiActivitySheet sysid needed to load the right tasks
     *  TODO for now lets just get it straight from the db
     */
    @SuppressWarnings("unchecked")
    @Begin(flushMode=FlushModeType.MANUAL)
    public void generateTasksForDayOfWeek() {
        log.debug("date to search for: " + this.tqiTaskDate);

        this.tqiTasksForOneDay = this.entityManager.createQuery("SELECT t from TqiTask t  where t.workDate = ?1 AND t.activitySheetSysid = ?2 order by t.sysid")
        .setParameter(1, this.tqiTaskDate).setParameter(2, this.activitySheetSysid).getResultList();
    }

getter/setters etc ...

activitySheetActionBean(一周的dayActionBeans):

/**
 * handle the activity sheet weekly code generation here
 */
@Name("tqiActivitySheetActionBean")
public class TQIActivitySheetActionBean implements Serializable{
    static Logger log = Logger.getLogger(TQIActivitySheetActionBean.class);

// tried it here first  
//  @In
//  EntityManager entityManager;


    @Out(value="tqiDayActionBeansForTheWeek", required=false)
    List<TQIDayActionBean> tqiDayActionBeansForTheWeek;

//  List<DaysOfTheWeek> daysOfTheWeekEnum;

    private BigDecimal currentlySelectedWeekActivitySheetSysid;

    @PostConstruct
    public void init(){
        log.debug("calling init");
        this.tqiDayActionBeansForTheWeek = new ArrayList<TQIDayActionBean>();
        this.updateDataWhenWeekChanges();
    }
 getters/setters more stuff ....

1 个答案:

答案 0 :(得分:1)

tQIDayActionBean的名为TQIDayActionBean的bean无法使用new进行实例化,并且绝对无法在应用程序中使用List<TQIDayActionBean>

与任何其他Seam托管bean一样,此bean只能注入@In或使用Component.getInstance()进行实例化。在第二种情况下(即Component.getInstance()),您应该理解Seam将始终返回相同的实例,只要您保持在上下文边界(在这种情况下直到会话结束)。

我建议您重新编写代码,以便将TQIDay标准类(没有@Name@Inject)分开,以便为需要在多个实例中管理和收集的数据建模,来自TQIActionBean,您可以注册EntityManager