OpenJPA 与 Glassfish 配合得很好吗?

2023-12-06

有人成功地将 OpenJPA 与 Glassfish 结合使用吗?

我正在尝试将 OpenJPA 2.1 与 Glassfish 3.1 开源一起使用。我已按照此处的说明将两者集成 ->http://weblogs.java.net/blog/ss141213/archive/2006/07/using_openjpa_a.html

我在 Eclipse Indigo 中有一个非常简单的 EJB 项目,其中包含以下内容:

  • com.rares.test.Person - @Entity
  • com.rares.test.PersonManager - 接口
  • com.rares.test.PersonDao - @Stateless

但是,当我尝试部署时,我的 Person @Entity 上出现了 ClassNotFoundException。投诉似乎是在我的 PersonDao 中实现的创建方法上的 Person 参数(请参阅下面的所有代码)。

我尝试过相同的项目,但没有在 persistence.xml 中指定提供程序,并且该项目工作正常(能够将 Person @Entity 持久保存到 MySql 中的 PERSON 表)。如果我不指定提供程序,我认为我正在使用 EclipseLink(如果我错了,请纠正我)。这让我相信我没有正确配置 Glassfish 的 OpenJPA。

堆栈跟踪

Caused by: java.lang.IllegalArgumentException: java.lang.ClassNotFoundException: com.rares.test.Person
    at serp.util.Strings.toClass(Strings.java:164)
    at serp.util.Strings.toClass(Strings.java:108)
    at serp.bytecode.BCClass.getType(BCClass.java:566)
    at org.apache.openjpa.enhance.PCEnhancer.<init>(PCEnhancer.java:283)
    at org.apache.openjpa.enhance.PCEnhancer.<init>(PCEnhancer.java:254)
    at org.apache.openjpa.enhance.PCClassFileTransformer.transform0(PCClassFileTransformer.java:144)
    at org.apache.openjpa.enhance.PCClassFileTransformer.transform(PCClassFileTransformer.java:124)
    at org.apache.openjpa.persistence.PersistenceProviderImpl$ClassTransformerImpl.transform(PersistenceProviderImpl.java:294)
    at org.glassfish.persistence.jpa.ServerProviderContainerContractInfo$1.transform(ServerProviderContainerContractInfo.java:98)
    at com.sun.enterprise.loader.ASURLClassLoader.findClass(ASURLClassLoader.java:742)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2427)
    at java.lang.Class.privateGetPublicMethods(Class.java:2547)
    at java.lang.Class.getMethods(Class.java:1410)
    at com.sun.enterprise.deployment.EjbDescriptor.addAllInterfaceMethodsIn(EjbDescriptor.java:2327)
    at com.sun.enterprise.deployment.EjbDescriptor.getLocalRemoteBusinessMethodDescriptors(EjbDescriptor.java:2290)
    ... 40 more

com.rares.test.Person

@Entity
@Table (name="PERSON")
public class Person implements Serializable {
    private static final long serialVersionUID = 3707476467775531463L;

    @Id
    @GeneratedValue (strategy=GenerationType.IDENTITY)
    @Column private Long id;
    @Column private String name;

com.rares.test.PersonManager

public interface PersonManager {
    void create (com.rares.test.Person p);
}

com.rares.test.PersonDao

@Stateless
public class PersonDao implements PersonManager {
    @PersistenceContext (unitName="RarePersistUnit")
    protected EntityManager mgr;

    @Override
    public void create(com.rares.test.Person p) {
        mgr.persist(p); 
    }

}

持久性.xml

<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="RarePersistUnit">
        <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
        <jta-data-source>jdbc/RaresMySql</jta-data-source>
        <class>com.rares.test.Person</class>        
        <properties>

        </properties>
    </persistence-unit>
</persistence>

注:以下假设OpenJPA 2.1 and 玻璃鱼3.1。两个版本的结果可能会有所不同。

抛出的异常是典型的执行失败字节码增强在运行时由 OpenJPA 执行。字节码增强可以在构建时或运行时完成。获得运行时支持的更好选择之一是使用javaagent但需要一些奇怪的配置:

  • 它要求您指定一个javaagent在 Glassfish 域配置文件中(通过指定附加的jvm-options下的元素java-config元素),
  • 并修改类路径的默认值${com.sun.aas.installRoot}/modules/glassfish.jar包括commons-lang-2.4.jar(我懒得这样做,因为这会导致一个非常脆弱的设置)。

其他可以在运行时使用的选项非常不稳定,并且选择使用Serp因为字节码增强器是部署时抛出异常的原因。显然,部署时间增强无法找到持久性上下文中使用的类,因为使用了不正确的类加载器来定位类。就我而言,玻璃鱼EarClassLoader and EarLibClassLoader类加载器用于在两次单独的调用中加载类,两次调用都失败并显示以下消息(堆栈跟踪在这里并不重要):

WARNING: LDR5207: ASURLClassLoader EarLibClassLoader : 
doneCalled = true
doneSnapshot = ASURLClassLoader.done() called ON EarLibClassLoader : 
urlSet = []
doneCalled = false 
 Parent -> org.glassfish.internal.api.DelegatingClassLoader@10e3c8c
 AT Sun Jul 17 13:27:54 IST 2011 
 BY :java.lang.Throwable: printStackTraceToString
    at com.sun.enterprise.util.Print.printStackTraceToString(Print.java:639)
    at com.sun.enterprise.loader.ASURLClassLoader.done(ASURLClassLoader.java:211)
    ...

...

WARNING: LDR5207: ASURLClassLoader EarClassLoader : 
doneCalled = true
doneSnapshot = ASURLClassLoader.done() called ON EarClassLoader : 
urlSet = [URLEntry : file:/C:/glassfish3/glassfish/domains/domain1/eclipseApps/app-ear/app-jsf-0.0.1-SNAPSHOT_war/WEB-INF/classes/, URLEntry : file:/C:/glassfish3/glassfish/domains/domain1/eclipseApps/app-ear/app-jsf-0.0.1-SNAPSHOT_war/WEB-INF/lib/commons-fileupload-1.2.1.jar, URLEntry : file:/C:/glassfish3/glassfish/domains/domain1/eclipseApps/app-ear/app-jsf-0.0.1-SNAPSHOT_war/WEB-INF/lib/commons-io-1.4.jar, URLEntry : file:/C:/glassfish3/glassfish/domains/domain1/eclipseApps/app-ear/app-jsf-0.0.1-SNAPSHOT_war/WEB-INF/lib/primefaces-3.0.M2.jar, URLEntry : file:/C:/glassfish3/glassfish/domains/domain1/generated/ejb/app-ear/app-jsf-0.0.1-SNAPSHOT_war/, URLEntry : file:/C:/glassfish3/glassfish/domains/domain1/eclipseApps/app-ear/app-ejb-0.0.1-SNAPSHOT_jar/, URLEntry : file:/C:/glassfish3/glassfish/domains/domain1/generated/ejb/app-ear/app-ejb-0.0.1-SNAPSHOT_jar]
doneCalled = false 
 Parent -> org.glassfish.internal.api.DelegatingClassLoader@1a3fe65
 AT Sun Jul 17 13:27:54 IST 2011 
 BY :java.lang.Throwable: printStackTraceToString
    at com.sun.enterprise.util.Print.printStackTraceToString(Print.java:639)
    at com.sun.enterprise.loader.ASURLClassLoader.done(ASURLClassLoader.java:211)
    ...

...

显然,由于某种未知的原因,EJB 生成的类区域在运行时不包含 JPA 实体类,导致在部署时无法找到这些类。最可能失败的原因是实体类虽然封装在 EJB 模块中,但它们本身可能尚未放置在生成的类目录中;只有带注释的 EJB 类可能被放置在那里。

因此,唯一合理的选择是使用构建时间增强,这是使用 Maven POM 中的以下配置适当完成的:

 <build>
     <plugins>
         <plugin>
             <groupId>org.apache.maven.plugins</groupId>
             <artifactId>maven-antrun-plugin</artifactId>
             <version>1.6</version>
                 <executions>
                     <execution>
                         <phase>process-classes</phase>
                         <configuration>
                             <tasks>
                                 <taskdef name="openjpac" classname="org.apache.openjpa.ant.PCEnhancerTask" classpathref="maven.compile.classpath"/>
                                 <openjpac>
                                     <classpath refid="maven.compile.classpath"/>
                                 </openjpac>
                             </tasks>
                         </configuration>
                         <goals>
                             <goal>run</goal>
                         </goals>
                     </execution>
                 </executions>
             </plugin>
         </plugins>
    </pluginManagement>
</build>

上述配置源自 OpenJPA 文档使用 Maven 增强类。请注意,我没有使用openjpa-maven-plugin,因为在撰写本文时,OpenJPA 2.2.0 版本仅作为快照提供。

当然,上述任何一个都需要在 Glassfish 3.1 中安装 OpenJPA 2.1,这是通过将以下 JAR 复制到${com.sun.aas.installRoot}/glassfish/lib(例如,C:/glassfishv3/glassfish/lib),而不是旧博客文章中提供的复制到的建议${com.sun.aas.instanceRoot}/lib(例如,C:/glassfishv3/glassfish/domains/domain1/lib)

  • commons-beanutils-1.8.3.jar
  • commons-collections-3.2.1.jar
  • commons-dbcp-1.4.jar
  • commons-lang-2.4.jar
  • commons-logging-1.0.4.jar
  • commons-pool-1.5.4.jar
  • serp-1.13.1.jar
  • openjpa-2.1.0.jar

显然,将这​​些 JAR 放入${com.sun.aas.instanceRoot}/lib导致 Maven Glassfish 插件部署应用程序失败。

其他 JAR(geronimo-*, derby-* and org.apache.bval*)存在于 OpenJPA 2.1 发行版中,由 Glassfish 3.1 作为 Java EE 6 SDK、Java DB 实现或 Derby 客户端的一部分提供,并且位于 JSR 303 bean 验证框架(Hibernate Validator)内。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenJPA 与 Glassfish 配合得很好吗? 的相关文章

  • 从 Glassfish 取消部署 Grails 应用程序会发生类不变性违规

    我有一个在 Glassfish 中运行的 Grails 应用程序 但是当我取消部署时 它会出现 违反类不变性 快速查看堆栈跟踪并在网络上搜索报告 这是 Log4j 的问题 我当时使用的是最新的log4jlog4j 1 2 16 jar 任何
  • 如何从不同 JVM 中的独立 java 程序调用 EJB

    我使用具有 glassfish 服务器的 NETbeans IDE 开发了 EJB 我可以从独立的java调用它 只要这个java项目是在NETbeans下开发并在相同的JRE下运行的 但我需要找出如何在不同的 jre 中运行它 我在这方面
  • 如何在 JPQL 语句中使用类型转换?

    我有两个Integer数据库中的列 derby 和 db2 我需要将它们彼此分开JPQL 两列都是类型Integer如果余数是十进制数 则返回零 例如0 25变成0等等 这是可以理解的 因为类型是 int In SQL例如我可以有这个 se
  • Hibernate vs JPA vs JDO - 各自的优缺点? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我熟悉 ORM 这个概念 几年前我什至在 NET 项目中使用过 nHibernate 然而 我还没有跟上 Java 中 ORM 的主题
  • JPA:运行时如何指定类对应的表名?

    注意 我对 Java 非常熟悉 但对 Hibernate 或 JPA 还不太熟悉 还没有 我想编写一个通过 JPA 与 DB2 400 数据库通信的应用程序 现在我可以获取表中的所有条目并将它们列出到 System out 使用 MyEcl
  • 复杂的 Activiti + JPA 查询

    我们正在尝试在一个新项目中使用Activiti 我创建了一个设置 它通过 JPA 使用 Hibernate 来持久保存流程中涉及的实体 并且 JPA 与 Activiti 互连 因此我们可以将这些实体用作 JPA 变量 看 Activiti
  • @PreUpdate 不适用于 Spring Data JPA

    我有一个实体 Entity EntityListeners MyEntityListener class class MyEntity 还有听者 class MyEntityListener PrePersist PreUpdate pub
  • 业务代表与服务定位器

    Business Delegate 和 Service Locator 之间有什么区别 两者都负责封装查找和创建机制 如果 Business Delegate 使用 Service Locator 来隐藏查找和创建机制 那么 Busines
  • 为什么我们在同一台服务器上使用多个应用程序服务器实例

    我想这是有充分理由的 但我不明白为什么有时我们会在同一物理服务器上放置例如 5 个具有相同 Web 应用程序的实例 这与多处理器架构的优化有关吗 JVM 或其他允许的最大内存限制 嗯 过了很长一段时间我又看到这个问题了 一台机器上的多个 J
  • Hibernate 抛出奇怪的错误:类未映射

    这是错误 org hibernate hql ast QuerySyntaxException Payment is not mapped select p from Payment p 我不明白为什么会抛出这个错误 应该映射该类 正如我将
  • 将 CommonJ 实现与 GlassFish 和 Spring 3 结合使用

    为了统一 Websphere 7 和 GlassFish 3 环境之间的部署 我决定尝试在 GlassFish 中实现 CommonJ WorkManager 和 TimerManager 但它并没有完全按预期工作 我做了以下事情 使用位于
  • 可空日期列合并问题

    我在 Geronimo 应用程序服务器上使用 JPA 和下面的 openjpa 实现 我也在使用MySQL数据库 我在更新具有可为空 Date 属性的对象时遇到问题 当我尝试合并 Date 属性设置为 null 的实体时 不会生成 sql
  • Jackson:将对象引用为属性

    在我的 java spring 应用程序中 我正在使用 hibernate 和 jpa 并使用 jackson 来填充数据库中的数据 这是用户类 Data Entity public class User Id GeneratedValue
  • JPA 中的复合键

    我想创建一个具有自动生成的主键的实体 而且还有一个由其他两个字段组成的唯一复合键 我如何在 JPA 中执行此操作 我想这样做是因为主键应该用作另一个表中的外键 并且使其复合并不好 在下面的代码片段中 我需要命令和模型是唯一的 pk当然是主键
  • 如何使用 Hibernate (EntityManager) 或 JPA 调用 Oracle 函数或过程

    我有一个返回 sys refcursor 的 Oracle 函数 当我使用 Hibernate 调用该函数时 出现以下异常 Hibernate call my function org hibernate exception Generic
  • 生成的序列以 1 开头,而不是注释中设置的 1000

    我想请求一些有关 Hibernate 创建的数据库序列的帮助 我有这个注释 下面的代码 在我的实体类中 以便为合作伙伴表提供单独的序列 我希望序列以 1000 开头 因为我在部署期间使用 import sql 将测试数据插入数据库 并且我希
  • 在 Java EE 中手动启动新线程安全吗?

    对于在会话范围内的 JSF 托管 bean 中生成线程是否安全 我找不到明确的答案 线程需要调用无状态 EJB 实例 依赖注入到托管 bean 上的方法 背景是我们有一份需要很长时间才能生成的报告 由于我们无法更改服务器设置 这导致 HTT
  • ejb 查找因 NamingException 失败

    我在 web xml 中添加了以下内容
  • 打开新EntityManager后线程锁

    我在使用 Spring JPA 事务时遇到一个非常奇怪的错误 该线程被锁定大约 16 分钟 然后继续 没有任何问题 情况如下 Transactional propagation Propagation REQUIRES NEW public
  • JPA 中所有命名查询的列表

    我想获取应用程序中所有 NamedQueries 的列表 并且我还想在运行时一般调用它们 是否有一个选项可以获取列表以及某种元数据 一般来说是某种反射 另一个线程为 NHibernate 提供了某种解决方案 即使使用 Hibernate 作

随机推荐

  • 使用 SHA1 和 RSA 与 java.security.Signature 对比 MessageDigest 和 Cipher

    我试图理解Java是什么java security Signature类确实如此 如果我计算 SHA1 消息摘要 然后使用 RSA 加密该摘要 我会得到与询问不同的结果签名类来签署相同的东西 Generate new key KeyPair
  • 仅创建过程权限

    我在开发数据库中有 SQL Server 2008 的需求 只有 DBA 数据库所有者 才能创建 更改表 开发人员不应创建或更改表 开发人员可以创建 更改存储过程 用户定义函数 在 dbo 模式中并且可以执行 SP UDF 开发人员应该对表
  • SQL 中按日期排序

    我有一个资源表 其中一个字段是数据类型为日期的日期字段 我想要以下输出 当前月份记录 比如五月 年份并不重要 然后是以下内容 再次假设五月是当月 六月记录 七月记录 八月唱片 九月记录 十月记录 十一月记录 十二月记录 一月记录 二月记录
  • 我可以只为 div 的背景图像设置不透明度吗?

    假设我有 div class myDiv Hi there div 我想放一个background image并给它一个opacity of 0 5 但我希望我写的文字完全不透明 1 如果我像这样写CSS myDiv opacity 0 5
  • java中的叠加图像

    我希望你能给我一些建议来解决我的问题 我需要在按钮上叠加许多图像 但问题是 这是基础图像 牙齿 http i imgur com 7tIcP gif 我的第一张图片是这样的 https i stack imgur com zPaH9 gif
  • 如何在 JavaScript 中第一次出现多个子字符串之一时分割字符串?

    给定字符串 s1 abcfoodefbarghi and s2 abcbardefooghi 如何将 s1 拆分为 abc 和 defbarghi 和 s2 到 abc 和 defooghi 即 在字符串 foo 或 bar 第一次出现时将
  • 如何对相机图像应用效果?

    我们如何将棕褐色滤镜等效果应用于相机图像 在此网址中了解基本想法http www riagora com 2010 07 android air and the camera 然后参考android Graphics 它可以帮助您了解Blu
  • 进行媒体查询的最佳方式[关闭]

    Closed 这个问题是基于意见的 目前不接受答案 在 HTML 中放置媒体查询的最佳方式是什么 在同一个 CSS 文件中 例如 my text font size 30px media only screen and max width
  • 使 GridView 页脚在没有数据绑定时可见

    当gridview中没有数据时如何显示页脚以从页脚插入数据 最简单的方法是绑定一个长度为 1 的数组 您可以在其中添加任何您喜欢的内容来标识这是一个虚拟行 在 GridViews RowDataBound 方法中检查数据项是否为虚拟行 在尝
  • PHP:使用外部数据执行 ORDER BY?

    嘿大家 长话短说 如果您不介意向这位 PHP 新手伸出援手的话 我有一个名为 类别 的数据库字段 其中存储了以下内容 Fruit People Place Animals Landscape 我在数据库中还有一个单独的表 其中每个项目的字段
  • Mac OS 上的 Java 随机变慢

    我有一个 Java 程序 用于跨多个处理器进行一组科学计算 方法是将其分成多个部分并在不同的线程中运行每个部分 该问题是可以简单划分的 因此线程之间不存在争用或通信 他们访问的唯一公共数据是一些不需要同步访问的共享静态缓存 以及硬盘驱动器上
  • 使用批处理文件修改文件内容

    我需要创建一个批处理文件 使用它我们可以修改文件的内容 例如 Testing txt 文件包含一行 描述 MAN Human 改成 描述 MAN Human V2 仅在 MAN 末尾添加 V2 因此 当我们打开文件时 我们会看到描述名称 M
  • 如何在Spacy中为OOV术语指定词向量?

    我有一个预训练的 word2vec 模型 我将其加载到spacy对新单词进行矢量化 给定我执行的新文本nlp hi vector获取单词 hi 的向量 最终 需要对一个新单词进行向量化 该新单词不存在于我的预训练模型的词汇表中 在这种情况下
  • ASP.NET4 画布应用程序:回发导致意外重定向

    我正在使用工具包的 build 5 06 我才刚刚开始 尝试做一些简单的事情 让回发工作 但是 当用户单击回发按钮时 浏览器会快速重定向到某个内容 我认为是 uiserver 然后再次重定向到 facebookredirect axd 最后
  • Google App Engine 原子部分?

    假设您从数据存储中检索一组记录 类似于 select from MyClass whereserved false 我如何确保另一个用户没有设置保留仍然为假 我查看了事务文档 并对谷歌的解决方案感到震惊 该解决方案是捕获异常并在循环中重试
  • 使用 Google Identity Services (GIS) JavaScript SDK,如何扩展会话?

    per https developers google com identity oauth2 web reference js reference 似乎没有一个refresh token流动 过期时间是1小时 所以并不可怕 但我想在用户仍
  • Clearcase 和 java 进程:更改视图不适用

    我有一个简单的应用程序 它接收用户输入的 CC 流名称 并假设从该流存储库返回特定文件的内容 我尝试使用一个简单的 shell 脚本来执行此操作 用户输入流名称 java接收流名称 运行一个进程 该进程运行一个脚本 myccscript s
  • “无法找到主类”

    我尝试从命令提示符运行示例 Java 应用程序 但收到以下错误 Exception in thread main java lang NoClassDefFoundError com badlogic gdx helloworld Hell
  • Objective-C 序列化复杂对象列表

    我有一个类列表 如下所示 interface AISlideItem NSObject NSString PlaceHolderName NSUInteger PlaceHolderID property nonatomic strong
  • OpenJPA 与 Glassfish 配合得很好吗?

    有人成功地将 OpenJPA 与 Glassfish 结合使用吗 我正在尝试将 OpenJPA 2 1 与 Glassfish 3 1 开源一起使用 我已按照此处的说明将两者集成 gt http weblogs java net blog