Шов 2.2 с jboss 5 без ejb не может внедрить entityManager

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

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

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

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

Что я сделал, так это использовал перечисление для итерации в течение недели - создал dataTable из tqiActivitySheetActionBeans и перебрал их во вложенной dataTable.

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

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

<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, книги Seam in Action и вики Seam для JBoss 5 (Seam wiki)

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

(EntityManager)Component.getInstance("entityManager")

Но тогда у меня нет транзакционного доступа к базовому entityBean, и я получаю спящий режим 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 (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 ....

person gebuh    schedule 30.08.2011    source источник
comment
Пожалуйста, опубликуйте код класса, в котором вы получаете entityManager, введенный как null, и как вы используете этот класс.   -  person Stefano Travelli    schedule 31.08.2011
comment
готово, я подумал, что, возможно, проблема возникла из-за нового tqiDayActionBean в init, но я тоже не могу ввести его.   -  person gebuh    schedule 31.08.2011
comment
У вас есть еще какие-то компоненты, где сработала инъекция entity manager? Как вы называете TQIActivitySheetActionBean? Вы пробовали @In(create=true)?   -  person kraftan    schedule 01.09.2011
comment
@kraftan - единственное место, где я могу использовать entityManager без Component.getInstance (), - это классы, расширяющие EntityHome. Я пробовал использовать create = true. TQIActivitySheetActionBean доступен из представления: <rich:dataTable id="daysOfWeek" var="_daysOfWeek" value="#{tqiActivitySheetActionBean.tqiDayActionBeansForTheWeek}">   -  person gebuh    schedule 01.09.2011


Ответы (1)


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

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

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

person Stefano Travelli    schedule 31.08.2011
comment
Спасибо, Стефано, не могли бы вы расширить свой последний абзац? Если я создам стандартный класс, не возникнет ли у меня такая же проблема? TQIDayActionBean управляет группой tqiTasks (класс сущности). tqiTasks имеет отношения с другими объектами, поэтому, даже если бы я мог создать их в TQIActivitySheetActionBean (что я не могу, я попробовал это сначала, он закомментирован в этом классе), как бы мне избежать LazyInitializationExceptions, когда связанные объекты не подключены ( Я получаю их, когда использую Component.Instance, если я не использую FetchType.EAGER в tqiTask для связанных полей)? - person gebuh; 01.09.2011
comment
Извините, я не могу следовать всей логике вашего приложения. При условии, что вы не пытаетесь создать несколько экземпляров bean-компонента Seam и не создаете его с помощью new, если у вас есть область диалога компонента, у вас не будет LIE. Также убедитесь, что вы начали разговор. Попробуйте использовать ‹begin-talk join = true /› в yourpage.page.xml. - person Stefano Travelli; 01.09.2011
comment
Извините, вполне возможно, что я ошибаюсь. Я добавил объяснение того, что это зло должно делать вверху. - person gebuh; 01.09.2011