【问题标题】:Seam 2.2 with jboss 5 non ejb can't inject entityManager带有 jboss 5 非 ejb 的 Seam 2.2 无法注入 entityManager
【发布时间】:2011-11-07 04:59:38
【问题描述】:

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

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

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

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

我所做的是使用枚举在一周内进行迭代 - 创建 tqiActivitySheetActionBeans 的数据表并迭代嵌套数据表中的数据表。

员工需要能够添加、删除和编辑每一天的任务(在数据表中)。我将 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 仍然为空。

我在同一个包中有一堆 EntityHome 类,这些可以毫无问题地使用 entityManager。我看过的所有文档都表明我应该能够注入 entityManager,我遵循了 Seam 文档页面、Seam in Action 书和 JBoss 5 的 Seam wiki 中的配置信息 (Seam wiki)

我已经在 ManagedPersistence 类中设置了断点——在我想使用它之前,我似乎有一个 entityManager,在类和方法中添加了 @Transactional 注释。依然没有。我可以使用

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

但是我没有对底层 entityBean 的事务访问,并最终得到休眠 LazyInitializationExceptions。 我已经使用 Seam 快一年了,但我还没有让它工作。到目前为止,使用 Component 方法已经奏效,但是我们的设置肯定存在根本性错误,我无法让注入工作。 如有任何帮助,我将不胜感激。

用户类的 ETA 代码。

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

实体豆:

@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(一周的一天ActionBeans):

/**
 * 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 ....

【问题讨论】:

  • 请把你注入entityManager的类的代码发布为null,以及你如何使用这个类。
  • 完成,我认为可能是 init 中的“新”tqiDayActionBean 导致了问题,但我也无法注入。
  • 实体管理器的注入是否还有其他组件起作用?你怎么称呼TQIActivitySheetActionBean?你试过@In(create=true)吗?
  • @kraftan 我可以在不使用 Component.getInstance() 的情况下使用 entityManager 的唯一地方是在扩展 EntityHome 的类中。我试过使用 create=true。 TQIActivitySheetActionBean 被视图访问:&lt;rich:dataTable id="daysOfWeek" var="_daysOfWeek" value="#{tqiActivitySheetActionBean.tqiDayActionBeansForTheWeek}"&gt;

标签: jboss seam pojo entitymanager


【解决方案1】:

TQIDayActionBean 类的名为 tQIDayActionBean 的 bean 不能用 new 实例化,而且应用程序中绝对没有List&lt;TQIDayActionBean&gt;

这个 bean 和任何其他 Seam 管理的 bean 一样,只能用@In 注入或用Component.getInstance() 实例化。在第二种情况下(即Component.getInstance()),您应该了解只要您停留在上下文边界(在这种情况下直到对话结束),Seam 将始终返回相同的实例。

我建议您重新编写代码,以便将TQIDay 标准类(没有@Name@Inject)从TQIActionBean 中对您需要在多个实例中管理和收集的数据进行建模,其中你可以注入你的EntityManager

【讨论】:

  • 谢谢你 Stefano,你能扩展你的最后一段吗?如果我创建一个标准类,我不会有同样的问题吗?一个 TQIDayActionBean 管理一组 tqiTasks(一个实体类)。 tqiTasks 与其他实体有关系,所以即使我可以在 TQIActivitySheetActionBean 中创建 em(我不能,我首先尝试过,它在该类中被注释掉)当关联实体未连接时,我将如何避免 LazyInitializationExceptions(我在使用 Component.Instance 时得到这些,除非我在 tqiTask 中使用 FetchType.EAGER 来连接字段)?
  • 抱歉,我无法遵循您的所有应用程序逻辑。如果您不尝试创建 Seam bean 的多个实例并且不使用 new 实例化它,那么如果您的组件对话范围是有限的,那么您将不会有 LIE。还要确保您开始对话。尝试在 yourpage.page.xml 中使用
  • 对不起,我完全有可能搞错了。我在顶部添加了对这种邪恶应该做什么的解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-11
  • 1970-01-01
  • 1970-01-01
  • 2011-07-28
  • 2011-12-15
  • 2012-06-03
  • 2012-04-11
相关资源
最近更新 更多