以下所有代码都解析为一个简单的em.persist(实体)调用失败,当我读到的所有内容都说明这应该有效。在我调用em.persist()之前,一切都按预期运行。
谁能看到我出错的地方?
我的数据库是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 / go"
这是我的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部署在一个ear包中,这是我应该阅读它的地方:
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);
}
这是上述system.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(主键字段)这一事实困扰我,但由于表自动生成它们,因此我无法在保留之前分配一个。
感谢任何建议或更正。
答案 0 :(得分:1)
一切似乎都没问题,错误是无法找到goDataBase
持久性单元的配置。文件persistence.xml应位于 META-INF 文件夹中,但根据您的列表,该文件夹名为META_INF,这是不正确的。