2014-03-07 40 views
1

我已经创建了一个对应于数据库表的类,并且保持原样。类是用来存储APNS令牌(这不是问题的问题),是如下:NamedQuery导致EntityManager创建失败

@Entity 
@Table(name = "ApnsToken") 
@NamedQuery(name = "apnsToken.removeByToken", query = "DELETE FROM ApnsToken tok WHERE tok.Token = ?1") 
public class ApnsToken implements Serializable { 
    @Transient 
    private static final long serialVersionUID = 1516719311585221856L; 

    @TableGenerator(name = "ApnsTokenGen", table = "Sequences", pkColumnName = "BeanName", valueColumnName = "SeqNumber", initialValue = 1) 
    @Id 
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "ApnsTokenGen") 
    @Column(name = "TokenID", nullable = false) 
    private Long tokenId; 

    @Column(name = "Token") 
    private String Token; 

    public ApnsToken() { 
    } 
} 

persistence.xml中是如下:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> 
<persistence-unit name="unit-name" transaction-type="JTA"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <jta-data-source>data-source</jta-data-source> 

    <class>com.package.model.ApnsToken</class> 

    <properties> 
     <property name="hibernate.max_fetch_depth" value="3" /> 
     <property name="hibernate.show_sql" value="false"/> 
     <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.WebSphereTransactionManagerLookup"/> 
    </properties> 
</persistence-unit> 
</persistence> 

现在,我的问题是,当我部署EAR时,EntityManager无法创建,而且我知道它是导致问题的NamedQuery,因为当我将它注释掉时,一切正常......现在我确信我的错误是一个愚蠢的错误,但我一直在网上搜索,看看例子,一切看起来都很好。

NamedQuery应该删除指定为参数的令牌。

我已经在代码中试用过NamedQuery和一个像这样的:

DELETE FROM ApnsToken tok WHERE tok.Token = :mTok 

这里的堆栈跟踪:

javax.ejb.EJBException: Injection failure; nested exception is: java.lang.IllegalStateException: EntityManagerFactory has not been created for PU : PuId=myapp-ear#common-1.0.1-WS-websphere.jar#myapp-repos 
Caused by: java.lang.IllegalStateException: EntityManagerFactory has not been created for PU : PuId=myapp-ear#common-1.0.1-WS-websphere.jar#myapp-repos 
    at com.ibm.ws.jpa.management.JPAPUnitInfo.getEntityManagerFactory(JPAPUnitInfo.java:1369) 
    at com.ibm.ws.jpa.management.JPAPUnitInfo.getEntityManagerPool(JPAPUnitInfo.java:1577) 
    at com.ibm.ws.jpa.management.JPATxEntityManager.<init>(JPATxEntityManager.java:156) 
    at com.ibm.ws.jpa.management.JPAComponentImpl.getEntityManager(JPAComponentImpl.java:1053) 
    at com.ibm.ws.util.JPAJndiLookupObjectFactory.getObjectInstance(JPAJndiLookupObjectFactory.java:151) 
    at com.ibm.wsspi.injectionengine.InjectionBinding.getInjectionObject(InjectionBinding.java:659) 
    at com.ibm.wsspi.injectionengine.InjectionTargetField.inject(InjectionTargetField.java:245) 
    at com.ibm.ws.injectionengine.InjectionEngineImpl.inject(InjectionEngineImpl.java:620) 
    at com.ibm.ejs.container.StatelessBeanO.initialize(StatelessBeanO.java:287) 
    at com.ibm.ejs.container.CMStatelessBeanOFactory.create(CMStatelessBeanOFactory.java:45) 
    at com.ibm.ejs.container.EJSHome.createBeanO(EJSHome.java:1031) 
    at com.ibm.ejs.container.EJSHome.createBeanO(EJSHome.java:1141) 
    at com.ibm.ejs.container.activator.UncachedActivationStrategy.atActivate(UncachedActivationStrategy.java:84) 
    at com.ibm.ejs.container.activator.Activator.activateBean(Activator.java:599) 
    at com.ibm.ejs.container.EJSContainer.preInvokeActivate(EJSContainer.java:3964) 
    at com.ibm.ejs.container.EJSContainer.EjbPreInvoke(EJSContainer.java:3349) 
    at com.package.repos.EJSLocal1SLRepositoryDao_3de24cf0.putApnsToken(EJSLocal1SLRepositoryDao_3de24cf0.java) 

就像我说的,如果我删除的NamedQuery EntityManager的创建成功我可以坚持下来,找到并从数据库中删除条目没有问题。任何帮助或指针将不胜感激。

回答

0

它并不直接回答你的问题,但jpa的实体管理器已经内置了基于id的实体去除功能,通过使用entityManager.find()和entityManager.remove(),所以不需要命名查询。

+0

的问题是我不会直接访问ID,只有条目中包含的标记。这就是为什么我需要NamedQuery – Gladhus

+0

好吧,试试这个“删除tok从ApnsToken tok WHERE tok.Token =:id”我想你可能需要'tok'之间删除和从 –

+0

好吧,所以我只是尝试了这一点,它没有完全相同的东西和之前:/ – Gladhus

0

而不是

"DELETE FROM ApnsToken tok WHERE tok.Token = ?1" 

尝试

"DELETE FROM ApnsToken tok WHERE tok.Token = :someVariable" 
+0

我已经尝试过,没有任何成功,我会将其添加到我的问题。 – Gladhus