2015-08-23 50 views
0

下面的所有代码都解决了一个简单的em.persist(entity)调用失败,当我读到的所有东西都说这应该起作用。在调用em.persist()之前,所有的行为都像预期的那样。Stateless Bean不能坚持简单实体

任何人都可以看到我要去哪里错了吗?

我的数据库是MySql。
相关的MySql数据库是“godb​​”。
它包含一个名为“loggedins”的表。 我使用PK INT(10)NOT NULL AUTO_INCREMENT PRIMARY KEY来创建表的主键。

我用了GlassFish管理控制台:名为 “GoSQLPool”

配置一个Glassfish的JDBC连接池。我给了它额外的属性,所以当我PING它时,我会得到“Ping成功”。

我配置了一个名为“jdbc/go”的JDBC资源。它使用“GoSqlPool”。它的JNDI名称为“JDBC /去”

这是我persistance.xml文件:

<persistence 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_2_0.xsd" version="2.0"> 
    <persistence-unit name ="goDataBase"> 
    <jta-data-source>jdbc/go</jta-data-source> 
    </persistence-unit> 
</persistence> 

的persistence.xml部署在耳包,这是我读它应该是:

go.ear 
    META-INF 
     application.xml 
     persistence.xml 
    go.war 
    go-server.jar 

我的实体bean的注解如下:

@Entity(name="LoggedIn") 
@Table(name="loggedins") 
public class LoggedIn extends EntityParent implements Serializable, DataItemsValues { 
    //constructors 
    public LoggedIn() { 
    this.id = ""; this.pw = ""; this.hash = ""; 
    } 
    public LoggedIn(String id, String pw, String hash) { 
    this.id = id; this.pw = pw; this.hash = hash; 
    } 

在如此重要的情况下,EntityParent只是一个抽象类提醒我,我需要在所有实体中获得id,pw和hash方法,无论它们是持久字段还是瞬态字段。

public abstract class EntityParent { 
    abstract public String getId(); 
    abstract public String getPw(); 
    abstract public String getHash(); 
} 

我的无状态的Java bean被注释如下:

@Stateless 
public class LoggerBean { 
    @PersistenceContext(unitName = "goDataBase") 
    private EntityManager em; 

这是LoggerBean抛出异常的方法:

private Integer login (LoggedIn entity, String hash, String id, 
         String pw, StringBuffer sb) 
    throws GoExceptionServer { 
    U.upMarginS(); 
    String iAm = U.getIAmS (Thread.currentThread().getStackTrace()); 
    sb.append("\r\n" + iAm + "beg"); 

    try { 
     sb.append("\r\n " + iAm + "persiting entity: " + entity); 
///////////THIS IS THE ONLY NON PRINTING CODE/////////////////// 
     this.em.persist(entity); 

     sb.append("\r\n" + iAm + "end"); 
     U.downMarginS(); 
     return null; 
    } catch (Exception e) { 
     sb.append("\r\n " + iAm + "caught: " + e.getClass().getName()); 
     sb.append("\r\n " + iAm + "msg: " + e.getMessage()); 
     sb.append("\r\n " + iAm + "cause : " + e.getCause()); 
     sb.append("\r\n " + iAm + "Throwing a GoExceptionServer."); 
     sb.append("\r\n" + iAm + "end"); 
     U.downMarginS(); 
     throw new GoExceptionServer(MessageValues.MSG_KEY_UNEXPECTED_EXCEPTION); 
    } 

这是从上述系统输出的日志.out语句:

LoggerBean.login.............................beg 
     LoggerBean.login.............................persisting entity: LoggedInBean: PK(null) MBR_ID(G) MBR_PW(G) 
     LoggerBean.login.............................caught: java.lang.IllegalStateException 
     LoggerBean.login.............................msg: Unable to retrieve EntityManagerFactory for unitName goDataBase 
     LoggerBean.login.............................cause : null 
     LoggerBean.login.............................Throwing a GoExceptionServer. 
    LoggerBean.login.............................end 

我迷路了。任何人都可以提出一种方法来使这项工作? 事实上,LoggedIn实体有一个空PK(主键字段)困扰我,但由于表自动生成它们,我不能在它被保存之前分配一个。

任何建议或更正,赞赏。

回答

1

一切似乎都没问题,错误在于无法找到goDataBase持久性单元的配置。文件persistence.xml应位于文件夹META-INF中,但根据您的列表,该文件夹名为META_INF,该文件夹不正确。

+0

我的appologies。当我写这个问题时,这是一个错字。当我查看go.ear包时,persistence.xml与application.xml一起位于META-INF文件夹中。我在application.xml文件中需要做什么吗?现在我只是用它来设置“/ Go”的根目录。这个应用程序也在耳塞包中。我无法想到其他地方看。 – George

+0

明白了。我在go.ear包的META-INF中有persistence.xml。 它必须进入包含EJB类的jar文件的META-INF。例如。 go.ear /复的server.jar/META-INF/persistence.xml中。我离开go-server.jar的错误超出了我上面的描述。 – George