0

以下问题涉及 Netbeans 7.2,但我希望它也适用于 7.1、7.0、6.8 和 6.9。

我正在尝试从两个不同的数据库 DB1 和 DB2 映射实体类,这两个数据库都包含一个同名的表 TB。DB1.TB 和 DB2.TB 中的字段完全不同。

我正在为两个数据库生成实体并将类放入单独的包中(让我们说 DB1 的“entities.db1”和 DB2 的“entities.db2”)。

问题是当我为第二个数据库生成实体时,TB 表已经存在,因此只允许我进行 UPDATE 或 RECREATE。重新创建会删除另一个 TB 实体,而更新会造成混乱。

我尝试过创建单独的持久性单元,但这似乎没有任何区别(并且无法在“来自数据库的实体类”向导中选择 PU)。

我真的不想拥有名为 Db1Tb 和 Db2Tb 的类,尽管看起来我别无选择。我的问题是,我做错了吗?是否有另一种使用 Netbeans 创建实体类的方法,其中两个表具有相同的名称?

4

1 回答 1

0

我发现分离是关键……我创建了三个项目:

  • myEntities:来自数据库的实体类(禁止创建持久性单元)
  • myEJBs:实体类和本地接口的会话 Bean(这里是 PU)
  • myEJBRemotes:远程接口(由会话 Beans 向导创建)

如果只有一个 Web 应用程序引用这些 bean,我可以将它们全部打包并部署在一起。但是,由于我打算创建几个独立部署的 Web 应用程序,将 EJB 作为依赖项添加到每个模块会产生一个问题:在部署时,Glassfish 抱怨已经部署了具有该名称的 EJB。

再一次,分离是解决方案……我的第一个想法是部署 EJB 模块,然后将实体和远程模块作为依赖项添加到我的 Web 应用程序中。这不太奏效——EJB 模块没有对实体类的引用(在部署 EJB 时,它的依赖项不包含在发送到应用程序服务器的包中)。

创建另一个项目,这次将 ejb 模块和关联的 jars(实体和远程)打包成一个 EAR,终于成功了。这个EAR可以单独部署在Glassfish上,然后web应用只需要在Entity和Remote jars上添加依赖...

提示:

  1. 关于 maven-ear-plugin:添加<defaultLibBundleDir>lib</defaultLibBundleDir>到配置中,否则库会放在耳朵的根目录中,glassfish 开始抛出 NoClassDef 异常。

  2. 关于 Web 应用程序:如果您在单独的 EAR 中部署您的 Web 应用程序,并且您正在尝试使用一些自定义查询,那么您不能像所有东西都捆绑在一起那样从 EJB 中“借用”EntityManager(在至少,据我所知不是)。您需要创建一个新的持久性单元,尽管您可以在一个persistence.xml文件中共享多个单元,当然您也可以重用为 EJB 创建的实体。

  3. 关于持久性单元:因为持久性单元与实体不在同一个项目中,所以请确保设置<exclude-unlisted-classes>true</exclude-unlisted-classes>并包含 PU 表示的所有实体类。这对于 EJB 模块和Web 应用程序中的 PU 都是正确的。

我敢肯定这不是做到这一点的唯一方法,而且它可能(很有可能)也不是最好的方法。我很乐意听取任何提供更好方法的人的意见...

于 2013-01-03T16:20:55.237 回答