jjzjj

java - Unknown entity class 错误消息,即使该实体标有@Entity 注解

coder 2024-03-13 原文

我正在使用 Netbean6.9.1 和 JPA EclipseLink 构建 REST 网络应用程序。

我面临的问题是,即使我的实体类 MasatoTable 标有实体注释,我仍收到错误:

    (java.lang.IllegalArgumentException: Unknown entity bean class:
     class entity.MasatoTable, please verify that this class
 has been marked with the @Entity annotation.)

问题是当我从 NetbeanIDE 重新启动 GlassFish3 服务器时,它工作了一段时间,不知何故在某个时候,错误开始出现。我曾经使用 Toplink Essential 并且没有问题但是我已更改为 EclipseLink 并重新定义 persistence.xml(如下所示),此问题开始了。但是我没有看到任何我能想到的代码错误..

MasatoTable.java

@Entity
@Table(name = "MasatoTable")
public class MasatoTable implements Serializable {
...continue code...

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="kojoPU">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <non-jta-data-source>jdbc/koga_kojo</non-jta-data-source>
    <class>entity.MasatoTable</class>
    <properties>
      <property name="eclipselink.logging.logger" value="JavaLogger"/>
      <property name="eclipselink.logging.level.sql" value="FINEST"/>
      <property name="javax.persistence.jdbc.url" value="jdbc:sqlserver://KOGADBSERVER;databaseName=MasatoDB"/>
      <property name="javax.persistence.jdbc.password" value="foobar"/>
      <property name="javax.persistence.jdbc.driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
      <property name="javax.persistence.jdbc.user" value="koga"/>
    </properties>
  </persistence-unit>
</persistence>

看起来是同一个问题,但该票证的解决方案是从 Eclipselink 回滚到 Toplink。有没有人在不回滚到 toplink 的情况下解决了这个问题?

Unknown entity bean class after hot deploy: netbeans 6.9 + glassfish 2.1 + eclipselink jpa 2.0

更新

就我对这种情况的研究而言,看起来错误已经得到解决和修复?

https://bugs.eclipse.org/bugs/show_bug.cgi?id=288141

我的知识不足以理解整个事情,但我发现的事实很少:

Netbean6.9.1 提供EclipseLink 2.0.1 而最新版本是2.2.0

我下载了最新版本并将它们放入 lib 目录,然后重新部署,但没有运气,问题仍然存在。不确定我是否以错误的方式做事。

James 发表评论后更新

下面是我用来创建单例 EntityManagerFactory 的类及其使用方式。

package common;

import java.util.Date;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class EmProvider {

    private static final String DB_PU = "kojoPU"; //工場DB

    public static final boolean DEBUG = false;

    private static final EmProvider singleton = new EmProvider();

    private EntityManagerFactory emf;

    private EmProvider() {}

    public static EmProvider getInstance() {
        return singleton;
    }


    public EntityManagerFactory getEntityManagerFactory() {
        if(emf == null) {
            emf = Persistence.createEntityManagerFactory(DB_PU);
        }
        if(DEBUG) {
            System.out.println("factory created on: " + new Date());
        }
        return emf;
    }

    public void closeEmf() {
        if(emf.isOpen() || emf != null) {
            emf.close();
        }
        emf = null;
        if(DEBUG) {
            System.out.println("EMF closed at: " + new Date());
        }
    }

}//end class

如何使用:

EntityManager em = null;
   Object out = null;
   try {
       em = EmProvider.getInstance().getEntityManagerFactory().createEntityManager();
       Query query = em.createNativeQuery(sql);

       ....some code here
   }
   finally {
       if(em != null) {
           em.close();
       }
   }

通过查看我的代码,我认为...我不会关闭 EntityManagerFactory(不过我最终会关闭 EntityManager)

我还发现主题中的 "unknown entity bean class" 错误肯定会通过以下操作出现。

  1. 通过 Netbean 部署网络应用程序(这将打开浏览器)

  2. 在 Netbean IDE 中更改一些代码并保存。然后 Netbean 将在您按下保存按钮后立即自动重新部署(这称为“热部署”吗???)

  3. 返回浏览器并执行一些操作,例如添加一些涉及 EntityManager 的数据。

看起来错误发生是因为我在热部署时没有关闭实体管理器工厂?我必须调查一下。

最佳答案

您如何创建 EntityManager/Factory,它是托管的还是非托管的?

如果它不受管理,那么我相信 EclipseLink 不会以任何方式收到重新部署的通知,因此仍然会缓存旧的 EntityManagerFactory,因为它永远不会关闭。能保证热部署后关闭EntityManagerFactory吗?

您可以使持久性单元成为托管持久性单元,这可能会解决问题。

无论哪种方式,请在 EclipseLink 和 Glassfish 中记录一个错误并提供详细信息,因为应该跟踪此问题。

我认为这可能是错误,https://bugs.eclipse.org/bugs/show_bug.cgi?id=326552

请为这个错误投票,并在其中包含您的信息。

关于java - Unknown entity class 错误消息,即使该实体标有@Entity 注解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5087611/

有关java - Unknown entity class 错误消息,即使该实体标有@Entity 注解的更多相关文章

  1. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  2. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  3. ruby-on-rails - 迷你测试错误 : "NameError: uninitialized constant" - 2

    我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test

  4. ruby - 即使失败也继续进行多主机测试 - 2

    我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r

  5. ruby-on-rails - 如何在 Rails View 上显示错误消息? - 2

    我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c

  6. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

  7. ruby-on-rails - 错误 : Error installing pg: ERROR: Failed to build gem native extension - 2

    我克隆了一个rails仓库,我现在正尝试捆绑安装背景:OSXElCapitanruby2.2.3p173(2015-08-18修订版51636)[x86_64-darwin15]rails-v在您的Gemfile中列出的或native可用的任何gem源中找不到gem'pg(>=0)ruby​​'。运行bundleinstall以安装缺少的gem。bundleinstallFetchinggemmetadatafromhttps://rubygems.org/............Fetchingversionmetadatafromhttps://rubygems.org/...Fe

  8. ruby - #之间? Cooper 的 *Beginning Ruby* 中的错误或异常 - 2

    在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee

  9. ruby-on-rails - 每次我尝试部署时,我都会得到 - (gcloud.preview.app.deploy) 错误响应 : [4] DEADLINE_EXCEEDED - 2

    我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie

  10. ruby-on-rails - Rails 5 Active Record 记录无效错误 - 2

    我有两个Rails模型,即Invoice和Invoice_details。一个Invoice_details属于Invoice,一个Invoice有多个Invoice_details。我无法使用accepts_nested_attributes_forinInvoice通过Invoice模型保存Invoice_details。我收到以下错误:(0.2ms)BEGIN(0.2ms)ROLLBACKCompleted422UnprocessableEntityin25ms(ActiveRecord:4.0ms)ActiveRecord::RecordInvalid(Validationfa

随机推荐