Java 为什么我的实体管理器返回空的结果列表?

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,也许您可以看到我遇到

我的Web应用程序陷入了困境

对于我的学校项目,我们必须从经典的JDBC集成迁移到JPA集成。至于我自己,我决定使用HibernateJPA框架。我试过在一个SessionBean中的main中,它在那里工作。但每当我将它集成到Web Servlet中时,我注意到它返回空列表。我已尝试使用
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&amp;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&amp;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>