entitymanger возвращает значение null при вводе универсального dao - PullRequest
1 голос
/ 28 сентября 2010

Я использую шов с tomcate и icefaces, проблема в том, что когда я внедряю менеджер сущностей в компонентный компонент, он работает хорошо, но если поместить его в универсальный DAO, он возвращает null, мой код выглядит так:

this bean

@Scope(ScopeType.PAGE)
@Name("TestBean")
public class TestBean {
 public void test(ActionEvent actionEvent) {
  Roles entity = new Roles();
  entity.setName("cons");
  RolesDao dao = new RolesDao();
  dao.emPrisit(entity);

 }
}

DAO

public class RolesDao {
 @In
 EntityManager em;

 public void emPrisit(Roles entity) {
  em.persist(entity);
 }

}

Component.xml

<persistence:entity-manager-factory name="bookingDatabase"/>

<persistence:managed-persistence-context name="em"
                           auto-create="true" 
                entity-manager-factory="#{bookingDatabase}"/>   

persistence.xml

<persistence-unit name="bookingDatabase"
  transaction-type="RESOURCE_LOCAL">
  <provider>org.hibernate.ejb.HibernatePersistence </provider>
  <jta-data-source>java:comp/env/AP</jta-data-source>
  <properties>
   <property name="transaction.flush_before_completion" value="true" />
   <property name="transaction.factory_class"
    value="org.hibernate.transaction.JDBCTransactionFactory" />

   <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
   <!--
    <property name="hibernate.transaction.manager_lookup_class"
    value="org.hibernate.transaction.JBossTransactionManagerLookup"/>
   -->

  </properties>
 </persistence-unit>

ifЯ вставляю entitymanger в bean-компонент, а не в dao, он хорошо справляется со второй проблемой, когда я добавляю эту аннотацию перед entitymanger

@In
 @PersistenceContext(type = PersistenceContextType.EXTENDED)
 EntityManager em;

, который выдает это исключение

caused by: java.lang.IllegalArgumentException: @PersistenceContext may only be used on session bean or message driven bean components: TestBean
 at org.jboss.seam.Component.checkPersistenceContextForComponentType(Component.java:901)
 at org.jboss.seam.Component.scanField(Component.java:877)
 at org.jboss.seam.Component.initMembers(Component.java:557)
 at org.jboss.seam.Component.<init>(Component.java:244)
 at org.jboss.seam.Component.<init>(Component.java:205)
 at org.jboss.seam.init.Initialization.addComponent(Initialization.java:1186)
 ... 13 more

Ответы [ 2 ]

1 голос
/ 29 сентября 2010

Вам не нужны оба @In и @PersistenceContext на вашем EntityManager. Достаточно одного из них.

1 голос
/ 28 сентября 2010

Инъекция происходит только в Beans, поэтому у вашего DAO должно быть @Name («что-то»), в противном случае Seam не знает, что делать с вашим классом.

@Name("RolesDao")
public class RolesDao {
   @In
   EntityManager em;

   public void emPrisit(Roles entity) {
       em.persist(entity);
   }
}

Затем, чтобы использовать этот класс, вы должны сделать:

@In(value="RolesDao") // value="..." is optional
private RolesDao rolesDao;

или

org.jboss.seam.Component.getInstance(RolesDao.class)

Извините, если в примере кода есть ошибки, не было затмения, чтобы его попробовать.

Надеюсь, это поможет

...