未知的实体bean类,请验证此类是否已使用@Entity批注标记

时间:2014-06-11 16:41:07

标签: java eclipse jpa entity eclipselink

我正在为我的大学的研究项目构建应用程序,使用Eclipse和eclipselink JPA在Java中开发持久性。该应用程序由3个Eclipse项目组成,为简单起见调用它们A,B和C.项目A和C使用JPA访问其数据库,DB_A和DB_C。项目A使用内置的Java derby数据库,项目C使用MySQL数据库。 项目A和C都定义了一些实体和实体管理器。在每个项目中测试时,操作正常。然后,项目C被添加为项目B的参考,项目B被添加到项目A.(A-> B-> C) 项目A(主应用程序)使用本地数据库DB_A并且需要访问项目B的功能,该项目B调用连接到第二个数据库DB_C的项目C.这是当从项目C抛出以下异常时(之前工作正常):

线程中的异常"线程0" java.lang.IllegalArgumentException:未知 实体bean类:class database.model.VMModelSim,请验证这一点 class已标记为@Entity注释。

   at org.eclipse.persistence.internal.jpa.EntityManagerImpl.find(EntityManagerImpl.java:707)

   at org.eclipse.persistence.internal.jpa.EntityManagerImpl.find(EntityManagerImpl.java:588)

   at database.dao.DAO.find(DAO.java:40)

   at database.facade.FacadeImpl.find(FacadeImpl.java:32)

   at simulationmanager.services.VMServiceImpl.getById(VMServiceImpl.java:89)

   at simulationmanager.services.VMServiceImpl.getById(VMServiceImpl.java:1)

   at monitoring.util.ResourceAdapter.updateResource(ResourceAdapter.java:29)

   at monitoring.QueueProcessor.writeMessageToDB(QueueProcessor.java:58)

   at monitoring.QueueProcessor.run(QueueProcessor.java:44)

每个项目A和C都有自己的persistance.xml文件,区别在于持久性单元名称,声明的类和数据库驱动程序。

这是项目A的持久性xml文件。

<?xml version="1.0" encoding="UTF-8" ?>
<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"
  version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
  <persistence-unit name="todos" transaction-type="RESOURCE_LOCAL">
    <class>database.model.Server</class>
    <class>database.model.VirtualMachine</class>
    <class>database.model.CPU</class>
    <class>database.model.CPUCore</class>
    <class>database.model.HDD</class>
    <class>database.model.RAM</class>
    <class>database.model.DataCenter</class>
    <class>database.model.Rack</class>
    <properties>
      <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver" />
      <property name="javax.persistence.jdbc.url"
        value="jdbc:derby:/var/lib/one/workspace/databases/cloudDatabase;create=true" />
      <property name="javax.persistence.jdbc.user" value="test" />
      <property name="javax.persistence.jdbc.password" value="test" />

      <!-- EclipseLink should create the database schema automatically -->
      < <property name="eclipselink.ddl-generation" value="create-or-extend-tables" />  >
      <property name="eclipselink.ddl-generation.output-mode"
        value="database" />
    </properties>

  </persistence-unit>
</persistence> 

我该怎么做才能解决这个问题?该实体标有@Entity。如果只访问一个数据库,则操作正常。我认为问题出现是因为必须同时访问两个数据库。我们可以以某种方式修改persistance.xml文件吗?

1 个答案:

答案 0 :(得分:1)

我们设法找出问题所在。在项目A和C中,我们在相同的包名中具有相同的数据库访问类:包database.connection中的DBConnect.java。在这里,我们定义了持久性管理器名称(这是不同的!)。 当项目单独运行时,每个项目都访问自己的连接类。但是,当只运行项目A并且它引用了B然后引用了C时,创建与其数据库的连接的项目C中的类创建了一个具有项目A中定义的类的对象(因为名称相同)。因此,它试图为项目A中定义的模型创建持久性管理器,并编写项目C中定义的对象。我认为这是错误源。