Jakarta ee 带有独立客户端的EJB忽略persistence.xml(?)

Jakarta ee 带有独立客户端的EJB忽略persistence.xml(?),jakarta-ee,jpa,entity,jpa-2.0,persistence.xml,Jakarta Ee,Jpa,Entity,Jpa 2.0,Persistence.xml,请帮帮我,这快把我逼疯了。我已经研究了好几个小时了,但找不到一个符合我的情况的例子 我正在编写一个非常简单的JavaEE应用程序,它可以从一个独立的客户端对用户进行身份验证。 在Netbeans 7.3中,我有一个Java EE应用程序项目,其中包含一个EJB模块、一个应用程序客户机项目和一个单独的Java类库,用于bean的远程接口和实体 EJB模块有一个bean(AccountsBean.java),类库项目有bean的远程接口(AccountsBeanRemote.java)、实体(Acc

请帮帮我,这快把我逼疯了。我已经研究了好几个小时了,但找不到一个符合我的情况的例子

我正在编写一个非常简单的JavaEE应用程序,它可以从一个独立的客户端对用户进行身份验证。 在Netbeans 7.3中,我有一个Java EE应用程序项目,其中包含一个EJB模块、一个应用程序客户机项目和一个单独的Java类库,用于bean的远程接口和实体

EJB模块有一个bean(AccountsBean.java),类库项目有bean的远程接口(AccountsBeanRemote.java)、实体(Account.java)和persistence.xml文件。以下是项目布局的图片,您可以清楚地看到:

我想将帐户实例传递给客户端

我正在使用GlassFish3.1和JavaDB(Derby)

我有3个数据库:AccountsTest(我想在这里使用)、sample和sun appserv samples(这两个数据库是在Glassfish安装期间创建的)

问题在于,不管我在persistence.xml中指定了什么数据库连接,表总是在示例数据库sun appserv samples中创建的。在我看来,bean忽略了persistence.xml文件。可能问题在于persistence.xml与bean位于一个单独的项目中,但如果我想将帐户实例传递给远程客户端,这是IDE允许我这样做的唯一方式

以下是我的persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" 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">
  <persistence-unit name="LoginTest-libPU" transaction-type="JTA">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <class>logintest.lib.Account</class>
    <properties>
      <property name="javax.persistence.jdbc.url" value="jdbc:derby://localhost:1527/AccountsTest"/>
      <property name="javax.persistence.jdbc.password" value="app"/>
      <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver"/>
      <property name="javax.persistence.jdbc.user" value="app"/>
      <property name="eclipselink.ddl-generation" value="create-tables"/>
    </properties>
  </persistence-unit>
</persistence>
Account.java:

@Entity
@Table(name = "ACCOUNTS")
public class Account implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String name;
    private String password;

    public Account() {
    }

    ...other methods
我想我没有正确配置EntityManager,但是我应该把persistence.xml放在哪里呢?如果我把它放在EJB模块中,我还必须把实体放在EJB模块中,客户端将无法访问它们


提前谢谢

首先让我说明,我不清楚您看到这种行为的确切原因,因为考虑到您在Glassfish/JavaEE运行时所做的工作,我不熟悉预期的行为:您正在设置直接连接。相反,在JavaEE环境中,您需要“容器管理的持久性单元”[这里有一个猜测:容器将jta数据源默认为“sun appserv samples]”

因此,让Java EE为您管理连接:

  • 在Glassfish中,定义id为“TestAccountPool”的JDBC连接池。您可以从管理面板或通过命令行执行此操作。这将指定datasourceclassname()、事务隔离级别和配置属性,例如:

    networkProtocol=jdbc\\:derby
    serverName=localhost
    port=1527  [OR portNumber=1527; I use port, some docs say portNumber]
    databaseName=AccountsTest
    user=app
    password=app
    
  • 定义一个JNDI名为“JDBC/TestAccountData”的JDBC资源,该资源引用“TestAccountPool”

  • 调整persistence.xml文件以引用使用JNDI名称的托管数据库连接:

    <?xml version="1.0" encoding="UTF-8"?>
    <persistence version="2.0"
            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">
    
      <persistence-unit name="LoginTest-libPU" transaction-type="JTA">
    
        <jta-data-source>jdbc/TestAccountData</jta-data-source>
    
        <class>logintest.lib.Account</class>
    
        <properties>
          <property name="eclipselink.ddl-generation" value="create-tables"/>
        </properties>
      </persistence-unit>
    </persistence>
    
    
    jdbc/TestAccountData
    logintest.lib.Account
    

  • 支持JavaSE客户端 如果您还希望在Java SE中使用您的实体,那么:

  • 添加最初定义的
    编码到persistence.xml文件中

  • 更改第二个持久化单元的名称;它必须是独一无二的。我的工具(EclipseW/glassfish插件)抱怨有多个持久性单元;我无视这些警告

  • 将事务类型从“JTA”更改为“RESOURCE_LOCAL”,或仅删除它:

  • 在JavaSE代码中为新的持久化单元使用新名称


  • 哦,这是有道理的。persistence.xml是由netbeans生成的,因为它位于一个单独的类库中,所以它将其视为一个JavaSE环境。因此,它建立了一个直接连接,而不是使用容器。但我还是不能让它工作。现在我在调用persist()时遇到了这个错误:
    java.lang.IllegalArgumentException:Object:logintest.ejb.Account[id=0]不是一个已知的实体类型
    ,那么我应该把persistence.xml放在哪里呢?1.在教室里?2.在ejb模块中?3.在ejb模块中,以及在类库中使用不同的持久化单元名称?
    <?xml version="1.0" encoding="UTF-8"?>
    <persistence version="2.0"
            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">
    
      <persistence-unit name="LoginTest-libPU" transaction-type="JTA">
    
        <jta-data-source>jdbc/TestAccountData</jta-data-source>
    
        <class>logintest.lib.Account</class>
    
        <properties>
          <property name="eclipselink.ddl-generation" value="create-tables"/>
        </properties>
      </persistence-unit>
    </persistence>