Шов 2.2 с jboss 5 не ejb не может внедрить entityManager - PullRequest
0 голосов
/ 31 августа 2011

ETA объяснение того, что это должно делать.Сотрудник должен отслеживать активность за 2 недели.

Каждая неделя (tqiActivitySheetActionBean) содержит 7 дней (tqiDayActionBean).

Каждый день содержит задачи на этот день (tqiTasks)

Задачи отображаются по одной за раз (таким образом, сотрудник может переключаться между этой и последней неделями).

Я использовал перечисление для итерации в течение недели - создает таблицу данных типа tqiActivitySheetActionBeans иитерируйте их во вложенной таблице данных.

Сотрудник должен иметь возможность добавлять, удалять и редактировать задачи для каждого дня на месте (в таблице данных).Я обернул tqiTasks в tqiDayActionBean, чтобы сгруппировать их.

Я разместил это на сайте Seam, но я не получаю никаких укусов, я перепробовал все, что я знаю, и некоторые вещи, которые я не делаю, чтобызаставить это работать, но пока нет радости.Там есть информация о конфигурации для Jboss 5 с использованием EJB, Jboss 4 без.У меня есть разнесенная WAR с использованием Jboss 5 и Seam 2.2.0, а не EJB.Я не могу внедрить entityManager в свои POJO.Я попытался удалить ссылку на постоянство-ref-name из web.xml, добавил и удалил теги

<transaction:entity-transaction /> 
<transaction:ejb-transaction />

из компонент.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 и вики Seam для JBoss 5 ( Seam wiki).)

Я установил точки останова в классе ManagedPersistence - где, похоже, у меня есть entityManager вплоть до того времени, когда я хочу его использовать, добавлены аннотации @Transactional для класса и метода.Еще ничего.Я могу получить EM, используя

(EntityManager)Component.getInstance("entityManager")

Но тогда у меня нет транзакционного доступа к лежащему в основе entityBean, и в результате я получаю hibernate LazyInitializationExceptions.Я использую Seam уже почти год, и мне еще предстоит заставить это работать.До сих пор использование метода Component работало, но в нашей настройке должно быть что-то принципиально неправильное, что я не могу заставить работать инъекцию.Буду признателен за любую помощь.

ETA-код для пользовательских классов.

Класс сущности - TQITask.Класс TQIDayActionBean должен обрабатывать CRUD для группы TQITasks в течение одного дня, TQIActivitySheetActionBean обрабатывает TQIDayActionBeans в течение одной недели.

объектный компонент:

@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 ....

1 Ответ

1 голос
/ 01 сентября 2011

Бин с именем tQIDayActionBean класса TQIDayActionBean не может быть создан с помощью new, и нет абсолютно никакого способа иметь List<TQIDayActionBean> в приложении.

Этот боб, как и любой другойБин, управляемый швом, может быть введен только с помощью @In или создан с помощью Component.getInstance().Во втором случае (то есть с Component.getInstance()) вы должны понимать, что Seam всегда будет возвращать один и тот же экземпляр до тех пор, пока вы остаетесь в границах контекста (в данном случае, пока разговор не заканчивается).

Я предлагаючтобы вы переработали свой код, чтобы отделить стандартный класс TQIDay (без @Name и @Inject) для моделирования данных, которые необходимо обрабатывать и собирать в нескольких экземплярах, от TQIActionBean, где вы можете иметь свой EntityManager вводят.

...