Java 为什么我的实体管理器返回空的结果列表?
我的Web应用程序陷入了困境 对于我的学校项目,我们必须从经典的JDBC集成迁移到JPA集成。至于我自己,我决定使用HibernateJPA框架。我试过在一个SessionBean中的main中,它在那里工作。但每当我将它集成到Web Servlet中时,我注意到它返回空列表。我已尝试使用Java 为什么我的实体管理器返回空的结果列表?,java,xml,hibernate,jpa,jakarta-ee,Java,Xml,Hibernate,Jpa,Jakarta Ee,我的Web应用程序陷入了困境 对于我的学校项目,我们必须从经典的JDBC集成迁移到JPA集成。至于我自己,我决定使用HibernateJPA框架。我试过在一个SessionBean中的main中,它在那里工作。但每当我将它集成到Web Servlet中时,我注意到它返回空列表。我已尝试使用System.out.println()显示列表的大小 无论如何,我认为问题可能出在我的persistence.xml中,更具体地说是它缺少某种东西 这是我的persistence.xml,也许您可以看到我遇到
System.out.println()
显示列表的大小
无论如何,我认为问题可能出在我的persistence.xml
中,更具体地说是它缺少某种东西
这是我的persistence.xml
,也许您可以看到我遇到的问题:
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="PERSISTENCE" transaction-type="JTA">
<description>Hibernate JPA Configuration Example</description>
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<class>JavaBeans.Employee</class>
<class>JavaBeans.User</class>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/JEEPRJ?serverTimezone=Europe/Paris"/>
<property name="javax.persistence.jdbc.user" value="jee"/>
<property name="javax.persistence.jdbc.password" value="jee"/>
<property name="javax.persistence.jdbc.serverTimezone" value="Europe/Paris"/>
<property name="javax.persistence.jdbc.useSSL" value="false"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
<property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.SunOneJtaPlatform"/>
</properties>
</persistence-unit>
</persistence>
(别介意法语哈哈)
无论如何,如果有人看到实体经理返回空列表的原因,这将对我有很大帮助,让我明白我在哪里犯了愚蠢的错误
非常感谢各位,祝你们今天愉快
票价。如果在servlet中复制/粘贴上述会话bean的相同代码,请注意事务管理。由于会话bean将事务作为其默认行为进行管理,因此您不必在bean中管理它们。但是servlet没有这种行为,实现它们是您自己的责任
请注意,在属于视图层的servlet中实现与数据库相关的作业将是一种反模式。更好的方法是使用会话bean实现这种功能,只需在视图层内调用它们 我设法找到了问题所在。系好安全带,因为这将是一个漫长的旅程
在我的persistence.xml
中,我从未定义过
,因为我不理解它的目标以及我们为什么需要使用它
从那以后,我积累了大量的知识和智慧(不是真的,基本上是试错哲学)
所以。说够了。直截了当地回答
正如我前面所说,
不是在persistence.xml
中定义的,而是一个巨大的
部分
Netbeans IDE在目录的WEB-INF文件夹中生成一个文件。它被称为glassfish resources.xml
。我们的persistence.xml
在某种程度上与之绑定。在参考资料文件中,我们定义了所有JDBC连接属性。我们通过JNDI在池中命名它
因此,我们的新“persistence.xml”如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="m1se_appv2_war_1.0PU" transaction-type="JTA">
<jta-data-source>java:app/DBJEE</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties/>
</persistence-unit>
</persistence>
java:app/DBJEE
假的
以及著名的glassfish-resources.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE resources PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Resource Definitions//EN" "http://glassfish.org/dtds/glassfish-resources_1_5.dtd">
<resources>
<jdbc-connection-pool allow-non-component-callers="false" associate-with-thread="false" connection-creation-retry-attempts="0" connection-creation-retry-interval-in-seconds="10" connection-leak-reclaim="false" connection-leak-timeout-in-seconds="0" connection-validation-method="auto-commit" datasource-classname="com.mysql.jdbc.jdbc2.optional.MysqlDataSource" fail-all-connections="false" idle-timeout-in-seconds="300" is-connection-validation-required="false" is-isolation-level-guaranteed="true" lazy-connection-association="false" lazy-connection-enlistment="false" match-connections="false" max-connection-usage-count="0" max-pool-size="32" max-wait-time-in-millis="60000" name="mysql_JEEPRJ_jeePool" non-transactional-connections="false" pool-resize-quantity="2" res-type="javax.sql.DataSource" statement-timeout-in-seconds="-1" steady-pool-size="8" validate-atmost-once-period-in-seconds="0" wrap-jdbc-objects="false">
<property name="serverName" value="localhost"/>
<property name="portNumber" value="3306"/>
<property name="databaseName" value="JEEPRJ"/>
<property name="User" value="jee"/>
<property name="Password" value="***"/>
<property name="URL" value="jdbc:mysql://localhost:3306/JEEPRJ?useSSL=false&serverTimezone=Europe/Paris"/>
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
</jdbc-connection-pool>
<jdbc-resource enabled="true" jndi-name="java:app/DBJEE" object-type="user" pool-name="mysql_JEEPRJ_jeePool"/>
</resources>
顺便说一句,如果您使用的是5.7以上的MySQL版本,请绝对将URL中的useSSL属性定义为false(如果您不打算使用它)。谢谢Ahmad。我正在使用会话Bean进行数据库操作。问题是我似乎无法从这些操作中获得结果……如果您可以在会话bean中检索数据,那么您应该能够通过调用该会话bean在servlet中获得相同的结果。你确定吗,你跟你解释的一样?如果是这样,我需要查看您的代码的更多细节。但这就是问题所在,我无法在会话bean中检索数据。。。但是,如果我通过public static void main()
中的实体管理器工厂手动创建实体管理器,并对其进行逐件配置,我确实会通过手动创建的实体管理器接收数据。问题是会话Bean中的实体管理器没有接收数据。
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="m1se_appv2_war_1.0PU" transaction-type="JTA">
<jta-data-source>java:app/DBJEE</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties/>
</persistence-unit>
</persistence>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE resources PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Resource Definitions//EN" "http://glassfish.org/dtds/glassfish-resources_1_5.dtd">
<resources>
<jdbc-connection-pool allow-non-component-callers="false" associate-with-thread="false" connection-creation-retry-attempts="0" connection-creation-retry-interval-in-seconds="10" connection-leak-reclaim="false" connection-leak-timeout-in-seconds="0" connection-validation-method="auto-commit" datasource-classname="com.mysql.jdbc.jdbc2.optional.MysqlDataSource" fail-all-connections="false" idle-timeout-in-seconds="300" is-connection-validation-required="false" is-isolation-level-guaranteed="true" lazy-connection-association="false" lazy-connection-enlistment="false" match-connections="false" max-connection-usage-count="0" max-pool-size="32" max-wait-time-in-millis="60000" name="mysql_JEEPRJ_jeePool" non-transactional-connections="false" pool-resize-quantity="2" res-type="javax.sql.DataSource" statement-timeout-in-seconds="-1" steady-pool-size="8" validate-atmost-once-period-in-seconds="0" wrap-jdbc-objects="false">
<property name="serverName" value="localhost"/>
<property name="portNumber" value="3306"/>
<property name="databaseName" value="JEEPRJ"/>
<property name="User" value="jee"/>
<property name="Password" value="***"/>
<property name="URL" value="jdbc:mysql://localhost:3306/JEEPRJ?useSSL=false&serverTimezone=Europe/Paris"/>
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
</jdbc-connection-pool>
<jdbc-resource enabled="true" jndi-name="java:app/DBJEE" object-type="user" pool-name="mysql_JEEPRJ_jeePool"/>
</resources>