2010-09-28 63 views
1

我正在使用seam与tomcate和icefaces问题是当我注入实体管理器在组件bean中它运作良好,但如果把它放在通用DAO它返回null我的代码是这样的:entitymanger在放入通用dao时返回null

此豆

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

,如果我在豆注入entitymanger不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 
+0

你使用哪个应用程序服务器? – 2010-09-28 14:07:14

+0

tomcat6我删除@PersistenceContext(type = PersistenceContextType.EXTENDED) 我与cinversation的界限 – aatsy 2010-09-29 13:51:16

回答

1

你并不需要在你的EntityManager@In@PersistenceContext。其中一个就足够了。

1

注入只发生在Beans中,所以你的DAO应该有一个@Name(“something”),否则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) 

很抱歉,如果样本代码中有一些错误,也没有日食尝试。

希望这有助于

+0

谢谢,真的帮助我,但第二个问题怎么样 – aatsy 2010-09-28 12:09:09

+0

对不起,没有注意到第二部分。我从来没有遇到过这个问题,但从我的理解中可以看出,使用扩展上下文需要使bean成为会话bean“@Scope(ScopeType.Session)”。我从来不需要它,所以我不能说太多,对不起。 – Tiago 2010-09-28 13:31:11