是否可以从具有相同名称的表的两个数据库中创建实体类?

时间:2012-12-11 12:43:24

标签: hibernate netbeans

以下问题涉及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创建实体类的方法,其中两个表具有相同的名称?

1 个答案:

答案 0 :(得分:0)

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

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

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

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

创建另一个项目,这次将ejb模块和相关的jar(实体和遥控器)打包在一起作为EAR,最终成功了。这个EAR可以在Glassfish上独立部署,然后Web应用程序只需要在Entity和Remote jar上添加依赖...

提示:

  1. 关于maven-ear-plugin:将<defaultLibBundleDir>lib</defaultLibBundleDir>添加到配置中,否则将lib放入耳根,并且glassfish开始抛出NoClassDef异常。

  2. 关于网络应用程序:如果您在单独的EAR中部署网络应用程序,例如,您尝试使用某些自定义查询,则无法&#34 ;借&#34;如果所有内容都捆绑在一起,那么来自EJB的EntityManager就好了(至少,据我所知)。您需要创建一个新的持久性单元,虽然您可以在一个persistence.xml文件中共享多个单元,但您当然可以重用为EJB创建的实体。

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

  4. 我确定这不是唯一的方法,而且可能(很可能)也不是最好的方法。我很高兴听到任何人提供更好的方式......