繁体   English   中英

获取“java.lang.UnsupportedOperationException:”

[英]Getting “java.lang.UnsupportedOperationException:”

我创建了一个小型JPA项目来保存学生记录。 我使用Oracle数据库。 我使用OpenJPA作为JPa提供程序。

我已正确创建了Table学生和相关序列。

学生实体课程

@Entity
@Table(name = "Student")
public class Student implements Serializable {

    private int id;
    private String name;
    private static final long serialVersionUID = 1L;

    public Student() {
        super();
    }

    @Id
    @Column(name = "ID")
    @SequenceGenerator(name = "TRAIN_SEQ", sequenceName = "STUDENT_SEQ")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "TRAIN_SEQ")
    public int getId() {
        return this.id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @Column(name = "NAME")
    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

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="JPAOracleDemo">

        <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>

        <class>com.jpa.demo.model.Student</class>

        <properties>
             <property name="openjpa.ConnectionURL" value="jdbc:oracle:thin:@TEST:50111:TESTPEGAD1" />
            <property name="openjpa.ConnectionDriverName" value="oracle.jdbc.driver.OracleDriver" />
            <property name="openjpa.ConnectionUserName" value="admin" />
            <property name="openjpa.ConnectionPassword" value="admin" />
            <property name="openjpa.RuntimeUnenhancedClasses" value="supported" />
            <property name="openjpa.jdbc.Schema" value="MYSCHEMA" />
        </properties>

    </persistence-unit>

</persistence>

客户类

OpenJPAEntityManager em = JPAUtil.getEntityManager();
        OpenJPAEntityTransaction tx = em.getTransaction();
        tx.begin();

        // Create the instance of Employee Entity class
        Student student = new Student();
        student.setName("A.Ramesh");

        // JPA API to store the Student instance on the database.
        em.persist(student);
        tx.commit();
        em.close();

        System.out.println("Done...");

Util类

private static OpenJPAEntityManagerFactory emf = OpenJPAPersistence
            .createEntityManagerFactory("JPAOracleDemo", "META-INF/persistence.xml");

    private static OpenJPAEntityManager entManager;

    /**
     * No need to create any instance for this Util.
     */
    private JPAUtil() {
    }

    /**
     * Get {@link EntityManager}.
     * 
     * @return the {@link EntityManager}
     */
    public static OpenJPAEntityManager getEntityManager() {

        if (entManager == null || !entManager.isOpen()) {
            entManager = emf.createEntityManager();
        }

        return entManager;
    }

数据在学生表中成功保留,但我有以下错误

Exception in thread "Attachment 60230" java.lang.UnsupportedOperationException: cannot get the capability, performing dispose of the retransforming environment
    at com.ibm.tools.attach.javaSE.Attachment.loadAgentLibraryImpl(Native Method)
    at com.ibm.tools.attach.javaSE.Attachment.loadAgentLibrary(Attachment.java:253)
    at com.ibm.tools.attach.javaSE.Attachment.parseLoadAgent(Attachment.java:235)
    at com.ibm.tools.attach.javaSE.Attachment.doCommand(Attachment.java:154)
    at com.ibm.tools.attach.javaSE.Attachment.run(Attachment.java:116)
Exception in thread "main" java.lang.UnsupportedOperationException: cannot get the capability, performing dispose of the retransforming environment
    at sun.instrument.InstrumentationImpl.isRetransformClassesSupported0(Native Method)
    at sun.instrument.InstrumentationImpl.isRetransformClassesSupported(InstrumentationImpl.java:124)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:48)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
    at java.lang.reflect.Method.invoke(Method.java:600)
    at org.apache.openjpa.enhance.ClassRedefiner.canRedefineClasses(ClassRedefiner.java:123)
    at org.apache.openjpa.enhance.ManagedClassSubclasser.prepareUnenhancedClasses(ManagedClassSubclasser.java:122)
    at org.apache.openjpa.kernel.AbstractBrokerFactory.loadPersistentTypes(AbstractBrokerFactory.java:304)
    at org.apache.openjpa.kernel.AbstractBrokerFactory.initializeBroker(AbstractBrokerFactory.java:228)
    at org.apache.openjpa.kernel.AbstractBrokerFactory.newBroker(AbstractBrokerFactory.java:202)
    at org.apache.openjpa.kernel.DelegatingBrokerFactory.newBroker(DelegatingBrokerFactory.java:156)
    at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:213)
    at com.ibm.ws.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:45)
    at com.ibm.ws.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:30)
    at com.jpa.demo.util.JPAUtil.getEntityManager(JPAUtil.java:32)
    at com.jpa.demo.client.JPAClient.main(JPAClient.java:13)
1045  JPAOracleDemo  INFO   [main] openjpa.Enhance - Creating subclass for "[class com.jpa.demo.model.Student]". This means that your application will be less efficient and will consume more memory than it would if you ran the OpenJPA enhancer. Additionally, lazy loading will not be available for one-to-one and many-to-one persistent attributes in types using field access; they will be loaded eagerly instead.
Done...

Java版本

JDK 1.6

有人请告诉我这里的问题是什么?

更新:

我使用IBM Rational Software Architect for Websphere Software进行此开发。 这个问题与这个IDE有关。 当我默认创建JPA项目时,它会添加IBM jre。 我刚刚删除了IBM jre并尝试了SUN jre,然后它就成功了。 请让我知道为什么这个功能不支持IBM jre?

<property name="openjpa.RuntimeUnenhancedClasses" value="supported" />

首先,摆脱那个属性。

这是我的增强模板,这适用于OPENJPA:`

<path id="enhance.cp">
       <pathelement location="${basedir}${file.separator}${build.dir}" />
        <fileset dir="${basedir}${file.separator}ext_libs/">
          <include name="**/*.jar" />
    </fileset>
</path>
<property name="cp" refid="enhance.cp" />
 <target name="openjpa.libs.check" unless="openjpa.libs">
    <fail message="Please set -Dopenjpa.libs in your builder configuration!" />
 </target>
 <target name="build.dir.check" unless="build.dir">
    <fail message="Please set -Dbuild.dir in your builder configuration!" />
</target>
<target name="enhance" depends="openjpa.libs.check, build.dir.check">
    <echo message="${cp}" />
    <taskdef name="openjpac" classname="org.apache.openjpa.ant.PCEnhancerTask">
        <classpath refid="enhance.cp" />
    </taskdef>
    <openjpac>
        <classpath refid="enhance.cp" />
     <configpropertiesFile="${basedir}${file.separator}src${file.separator}main${file.separator}               resources${file.separator}META-INF${file.separator}persistence.xml" />
    </openjpac>
</target>

`

JPA规范要求对Entity对象进行某种类型的监视,但规范没有定义如何实现此监视。 一些JPA提供程序在运行时自动生成新的子类或代理对象,这些子类或代理对象位于用户的Entity对象之前,而其他提供程序则使用字节码编织技术来增强实际的Entity类对象。 OpenJPA支持这两种机制,但强烈建议仅使用字节码编织增强。 不建议使用子类化支持(由OpenJPA提供)(默认情况下在OpenJPA 2.0及更高版本中禁用)。(来源: http//openjpa.apache.org/entity-enhancement.html

这个问题的原因是我使用了实体增强的子类支持,但在OpenJPA2.0及更高版本中默认禁用。

我找到了解决这个问题的方法。 我们必须通过在启动OpenJPA运行的JVM时提供javaagent来在运行时增强实体类。

我把以下内容作为JVM参数

-javaagent:C:/OpenJPA/apache-openjpa-2.0.0/openjpa-2.0.0.jar

我从persistence.xml中删除了bellow行

<property name="openjpa.RuntimeUnenhancedClasses" value="supported" />

工作persistence.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="DataSourceDemo">

        <jta-data-source>oracleDS</jta-data-source>
        <class>com.auditlog.model.BatchPrint</class>

        <properties>
            <property name="openjpa.ConnectionUserName" value="admin" />
            <property name="openjpa.ConnectionPassword" value="test" />
            <property name="openjpa.jdbc.Schema" value="defaultScheme" />
        </properties>

    </persistence-unit>
</persistence>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM