我正在尝试增强(实体)类,因此不会出现以下异常:
Exception in thread "main" <openjpa-3.1.2-r66d2a72 nonfatal user error> org.apache.op
enjpa.persistence.ArgumentException: Attempt to cast instance "entities.EntityPerson@
6dba847b" to PersistenceCapable failed. Ensure that it has been enhanced.
FailedObject: entities.EntityPerson@6dba847b
at org.apache.openjpa.kernel.BrokerImpl.assertPersistenceCapable(BrokerImpl.java:486
3)
at org.apache.openjpa.kernel.BrokerImpl.persistInternal(BrokerImpl.java:2762)
at org.apache.openjpa.kernel.BrokerImpl.persist(BrokerImpl.java:2707)
at org.apache.openjpa.kernel.BrokerImpl.persist(BrokerImpl.java:2690)
at org.apache.openjpa.kernel.BrokerImpl.persist(BrokerImpl.java:2592)
at org.apache.openjpa.kernel.DelegatingBroker.persist(DelegatingBroker.java:1197)
at org.apache.openjpa.persistence.EntityManagerImpl.persist(EntityManagerImpl.java:8
37)
at openjpa.Test/main.Main.main(Main.java:23)
说我正在努力坚持的实例并没有得到加强。
我遵循了这一点:https://openjpa.apache.org/enhancement-with-maven.html官方openjpa页面,并将openjpa maven插件
添加到我的pom部分。xml:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>registry</groupId>
<artifactId>datalayer</artifactId>
<version>0.0.1</version>
<packaging>jar</packaging>
<properties>
<maven.compiler.target>11</maven.compiler.target>
<maven.compiler.source>11</maven.compiler.source>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.sourceEncoding>UTF-8</project.reporting.sourceEncoding>
</properties>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
</plugin>
<plugin>
<groupId>org.apache.openjpa</groupId>
<artifactId>openjpa-maven-plugin</artifactId>
<version>3.1.2</version>
<configuration>
<includes>datalayer/dto/*.class</includes>
<addDefaultConstructor>true</addDefaultConstructor>
<enforcePropertyRestrictions>true</enforcePropertyRestrictions>
</configuration>
<executions>
<execution>
<id>enhancer</id>
<phase>process-classes</phase>
<goals>
<goal>enhance</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
<dependencies>
<dependency>
<groupId>org.apache.openjpa</groupId>
<artifactId>openjpa</artifactId>
<version>3.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.derby</groupId>
<artifactId>derby</artifactId>
<version>10.15.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.derby</groupId>
<artifactId>derbytools</artifactId>
<version>10.15.2.0</version>
</dependency>
</dependencies>
</project>
,但我还是有例外。我正在使用Eclipse和内置命令runas-
使用和不使用openjpa-maven-plugin运行
mvn安装
不会改变任何东西(用相同的. class文件生成相同的. jar,相同的maven输出到控制台)
正如答案所说,在使用Maven构建时,我需要运行
openjpa:enhance
goal。事实上,我没有使用openjpamaven插件
,所以我解决了这个问题。Maven输出:
[INFO] Error stacktraces are turned on.
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------------< registry:datalayer >-------------------------
[INFO] Building datalayer 0.0.1
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ datalayer ---
[INFO] Deleting C:\Users\wortigson\Desktop\ISMatrikaBcWorkspace\Openjpa.Test\target
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ datalayer ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 1 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ datalayer ---
[WARNING] Can't extract module name from geronimo-jms_1.1_spec-1.1.1.jar: geronimo.jm
s.1.1.spec: Invalid module name: '1' is not a Java identifier
[WARNING] Can't extract module name from geronimo-jta_1.1_spec-1.1.1.jar: geronimo.jt
a.1.1.spec: Invalid module name: '1' is not a Java identifier
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 3 source files to C:\Users\wortigson\Desktop\ISMatrikaBcWorkspace\Op
enjpa.Test\target\classes
[INFO]
[INFO] --- openjpa-maven-plugin:3.1.2:enhance (default-cli) @ datalayer ---
130 DataLayer INFO [main] openjpa.Tool - Enhancer running on type "class entities
.EntityPerson".
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ datalayer ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 1 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ datalayer ---
[WARNING] Can't extract module name from geronimo-jms_1.1_spec-1.1.1.jar: geronimo.jm
s.1.1.spec: Invalid module name: '1' is not a Java identifier
[WARNING] Can't extract module name from geronimo-jta_1.1_spec-1.1.1.jar: geronimo.jt
a.1.1.spec: Invalid module name: '1' is not a Java identifier
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 3 source files to C:\Users\wortigson\Desktop\ISMatrikaBcWorkspace\Op
enjpa.Test\target\classes
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ datalay
er ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.8.1:testCompile (default-testCompile) @ datalayer
---
[WARNING] Can't extract module name from geronimo-jta_1.1_spec-1.1.1.jar: geronimo.jt
a.1.1.spec: Invalid module name: '1' is not a Java identifier
[WARNING] Can't extract module name from geronimo-jms_1.1_spec-1.1.1.jar: geronimo.jm
s.1.1.spec: Invalid module name: '1' is not a Java identifier
[INFO] Changes detected - recompiling the module!
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ datalayer ---
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ datalayer ---
[INFO] Building jar: C:\Users\wortigson\Desktop\ISMatrikaBcWorkspace\Openjpa.Test\tar
get\datalayer-0.0.1.jar
[INFO]
[INFO] --- maven-install-plugin:2.4:install (default-install) @ datalayer ---
[INFO] Installing C:\Users\wortigson\Desktop\ISMatrikaBcWorkspace\Openjpa.Test\target
\datalayer-0.0.1.jar to C:\Users\wortigson\.m2\repository\registry\datalayer\0.0.1\da
talayer-0.0.1.jar
[INFO] Installing C:\Users\wortigson\Desktop\ISMatrikaBcWorkspace\Openjpa.Test\pom.xm
l to C:\Users\wortigson\.m2\repository\registry\datalayer\0.0.1\datalayer-0.0.1.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
您可以看到我在EntityPerson类上运行了增强器,这是我测试这个的简单JPA实体。不过我还是有例外。我注意到
maven编译器插件:3.8.1:compile
运行了两次。openjpa maven插件:3.1.2:enhance前后的openjpa maven插件-这可能是问题吗?
我认为这不是我的情况:如何使用openJPA在构建时从单独的jar增强类?
发现有解决方法尝试将实例强制转换为PersistenceCapable失败。正如公认的答案所说,通过在配置中设置一些属性来确保它得到了增强,但我不想这样做,因为第一条评论说不建议这样做,并指向官方的openjpa页面,在那里我找到了如何在maven构建期间增强类的示例,但正如我所写的,它不起作用。
测试主要方法:
public static void main(String[] args)
{
HashMap<String, String> jpaProps = new HashMap<String, String>();
jpaProps.put("javax.persistence.jdbc.url", "jdbc:derby:testDB;create=true");
EntityManagerFactory factory = Persistence.createEntityManagerFactory("DataLayer", jpaProps);
EntityManager manager = factory.createEntityManager();
EntityPerson person = new EntityPerson();
person.setAge(25);
person.setName("Andrej Hruska");
manager.persist(person); // +
}
EntityPerson类:
package entities;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class EntityPerson
{
@Id
@GeneratedValue
private long id;
@Column(nullable = false)
private String name;
private int age;
public long getId()
{
return id;
}
public void setId(long id)
{
this.id = id;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
}
坚持不懈xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.2"
xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence https://www.oracle.com/webfolder/technetwork/jsc/xml/ns/persistence/persistence_2_2.xsd">
<persistence-unit name="DataLayer"
transaction-type="RESOURCE_LOCAL">
<non-jta-data-source>DataSource</non-jta-data-source>
<properties>
<property
name="javax.persistence.schema-generation.database.action"
value="create" />
<property name="javax.persistence.jdbc.driver"
value="org.apache.derby.jdbc.EmbeddedDriver" />
<property name="javax.persistence.jdbc.url"
value="jdbc:derby:db;create=true" />
</properties>
</persistence-unit>
</persistence>
项目结构:
繁殖步骤:
Crete Maven项目在Eclipse
- 复制我的pom.xml(或添加依赖到derby,openjpa和设置你的openjpa-maven-plugin,名称和路径)
- 复制我的persistence.xml(或者用一些持久性单元创建自己的)
- 复制我的EntityPerson类(或者创建简单的JPA实体来测试它)
- 运行mvn清洁编译openjpa:增强安装(重要部分是openjpa:增强)
- 尝试持久化实体,就像我在主方法中所做的那样
一些误解。
我尝试过只使用openjpa maven插件而不使用maven编译器插件,但没有任何帮助。
Maven的pom.xml被认为是“项目对象模型”,这意味着,对于你的“项目”来说,它是“建模”构建过程的“对象”。此对象从嵌入在Maven内部的父pom.xml中进行子类化,该pom.xml定义了默认构建;因此,如果您删除了“maven-编译器-插件”,您将获得默认的“maven-编译器-插件”配置。很可能配置很旧,与Maven一起发货,你可能最好包括一个“覆盖”来更新它。
Eclpise和Maven一起工作;但是,除非你知道它们是如何协同工作的,否则你会遇到很多问题。
Eclipse读取pom。xml
文件并生成一个Eclipse配置
,该配置应执行与pom相同的步骤。html" target="_blank">xml
文件,以相同的方式。当您使用Eclipse编译时,它不会运行mvn compile
,它基于Eclipse配置构建,该配置可能比最近编辑的pom更旧。xml
。因此,您应该在每次编辑pom之后重新阅读项目配置。使用ecplise时使用xml
。
如果您想查看与Eclipse类似的不同IDE;但是,调用mvncile
而不是调用自己的interperted版本“应该是相同的,但通常不是”,看看NetBeans。https://netbeans.apache.org/download/nb122/index.html与Ecplipse不同,它不包含自己的Maven插件(或自己的嵌入式编译器)的“命令镜像”,它使用mvn
命令和javac
编译器,并通过配置启动它们以生成大量输出消息,然后读取这些消息以更新其“IDE端”的内容。
我指出这一点的原因是,您可能正在按照说明进行操作,如果是,您可能会从命令行在mvn包上看到正确的输出,但在Eclipse中看不到(因为需要从源
pom.xml
刷新Eclipse项目)
您需要告诉maven运行增强目标。
mvn clean compile openjpa:enhance
您应该看到这个输出:
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ jpa-example ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 2 source files to /home/gordon/docs/programming/openjpa/jpa-example/target/classes
[INFO]
[INFO] --- openjpa-maven-plugin:3.1.2:enhance (default-cli) @ jpa-example ---
[INFO]
马文有等级制度。顶部是由作为插件目标实现的阶段组成的生命周期。包装决定了一个阶段的目标。
增强目标不是构建或编译的默认目标之一。
在eclipse中,如果更改pom。xml您需要右键单击并选择Maven-
将插件定义移动到from
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>registry</groupId>
<artifactId>datalayer</artifactId>
<version>0.0.1</version>
<packaging>jar</packaging>
<properties>
<maven.compiler.target>11</maven.compiler.target>
<maven.compiler.source>11</maven.compiler.source>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.sourceEncoding>UTF-8</project.reporting.sourceEncoding>
</properties>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.openjpa</groupId>
<artifactId>openjpa-maven-plugin</artifactId>
<version>3.1.2</version>
<configuration>
<includes>datalayer/dto/*.class</includes>
<addDefaultConstructor>true</addDefaultConstructor>
<enforcePropertyRestrictions>true</enforcePropertyRestrictions>
</configuration>
<executions>
<execution>
<id>enhancer</id>
<phase>process-classes</phase>
<goals>
<goal>enhance</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.apache.openjpa</groupId>
<artifactId>openjpa</artifactId>
<version>3.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.derby</groupId>
<artifactId>derby</artifactId>
<version>10.15.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.derby</groupId>
<artifactId>derbytools</artifactId>
<version>10.15.2.0</version>
</dependency>
</dependencies>
</project>
插件管理仅用于配置——插件不会自动运行。
我试图使用maven plugin增强来自另一个Jar的实体类,不幸的是,我没有找到正确的方法。 所以我的问题是:为了能够在构建时增强来自外部Jar的类,我需要配置什么?
问题内容: 我有一个项目,我现在开始作为Maven项目,但是由于某种原因,它无法正常工作。这是我的pom.xml: 问题答案: 实际上,您的POM看起来有点奇怪: 它缺少Webapp项目的权利。 Maven War插件配置看起来不正确,您只是不需要添加的额外内容。 这是最小pom的样子: 因此,要么修改它,然后更新项目配置( 右键单击 您的项目,然后 右键单击 Maven >更新项目配置)。 或者
问题内容: 我正在使用Jenkins,Maven 3.1和Java 1.6。我在詹金斯(Jenkins)建立了以下Maven职位,并具有以下目标和选择… 下面是我的pom.xml surefire配置… 但是,当我的单元测试失败时,Jenkins控制台输出仍然显示“ BUILD SUCCESS”,并且该构建被标记为“不稳定”,而不是完全失败。我如何在Jenkins(如果事实如此,则为Maven)中
我使用的是Jenkins、Maven3.1和Java1.6。我有以下的Maven工作设置在詹金斯与以下目标和选择...
问题内容: 我是Maven和Checkstyle的新手,所以请保持礼貌:)。 我设法将maven与checkstyle插件一起使用,并且可以在代码上创建报告。但是我真正想要拥有的是,如果样式检查有任何错误,我可以停止Maven的构建过程。 到目前为止,我的pom.xml如下所示: 我如何在这里达到目标?我们的团队希望有严格的编码风格标准,所以我必须使用它。 问题答案: 为了实现所需的功能,除了报告
问题内容: 我已经在Eclipse IDE中创建了一个Aspectj项目,但是我需要使用Maven来构建它。 我有maven-aspectj插件,但不知道如何使用它。 问题答案: 以下是我执行此步骤的步骤。这给了我编译时的编织。如果您需要其他策略,显然您需要其他方法(例如用于运行时AOP代理的Spring AOP )。 添加一个属性以标准化您使用的AspectJ版本: 添加运行时依赖项: 添加As