gpt4 book ai didi

mysql - 无状态 Bean 无法持久化简单实体

转载 作者:行者123 更新时间:2023-11-29 12:02:24 24 4
gpt4 key购买 nike

下面的所有代码都解析为一个简单的 em.persist(entity) 调用,该调用失败了,而我读到的所有内容都表明这应该有效。一切都按预期运行,直到我调用 em.persist()。

有人能看出我哪里出错了吗?

我的数据库是MySql。
相关的MySql数据库是“godb​​”。
它包含一个名为“loggedins”的表。我使用 PK INT(10) NOT NULL AUTO_INCRMENT 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 只是一个抽象类,它提醒我我需要在所有实体中拥有 get id、pw 和 hash 方法,无论它们是持久字段还是 transient 字段。

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(主键字段)这一事实让我很困扰,但由于表自动生成它们,我无法在持久化之前分配它们。

如有任何建议或更正,我们将不胜感激。

最佳答案

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

关于mysql - 无状态 Bean 无法持久化简单实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32162558/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com