17

私は JPA を初めて使用し、主キー値の自動生成に問題があります。

次のエンティティがあります。

package jpatest.entities;

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class MyEntity implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    public Long getId() {
        return id;
    }

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

    private String someProperty;

    public String getSomeProperty() {
        return someProperty;
    }

    public void setSomeProperty(String someProperty) {
        this.someProperty = someProperty;
    }

    public MyEntity() {
    }

    public MyEntity(String someProperty) {
        this.someProperty = someProperty;
    }

    @Override
    public String toString() {
        return "jpatest.entities.MyEntity[id=" + id + "]";
    }    
}

および他のクラスの次の main メソッド:

public static void main(String[] args) {
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("JPATestPU");
    EntityManager em = emf.createEntityManager();

    em.getTransaction().begin();

    MyEntity e = new MyEntity("some value");    
    em.persist(e); /* (exception thrown here) */

    em.getTransaction().commit();

    em.close();
    emf.close();
}

これは私の永続化ユニットです:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.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_1_0.xsd">
  <persistence-unit name="JPATestPU" transaction-type="RESOURCE_LOCAL">
    <provider>oracle.toplink.essentials.PersistenceProvider</provider>
    <class>jpatest.entities.MyEntity</class>
    <properties>
      <property name="toplink.jdbc.user" value="..."/>
      <property name="toplink.jdbc.password" value="..."/>
      <property name="toplink.jdbc.url" value="jdbc:mysql://localhost:3306/jpatest"/>
      <property name="toplink.jdbc.driver" value="com.mysql.jdbc.Driver"/>
      <property name="toplink.ddl-generation" value="create-tables"/>
    </properties>
  </persistence-unit>
</persistence>

プログラムを実行すると、適切なコメントでマークされた行で次の例外が発生します。

Exception in thread "main" java.lang.IllegalArgumentException: Object: jpatest.entities.MyEntity[id=null] is not a known entity type.
        at oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl.registerNewObjectForPersist(UnitOfWorkImpl.java:3212)
        at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerImpl.persist(EntityManagerImpl.java:205)
        at jpatest.Main.main(Main.java:...)

私は何が欠けていますか?

4

11 に答える 11

10

NetBeansIDE6.9を使用して同じ問題が発生しました。

どうやら、これは既知の問題です。http://wiki.eclipse.org/EclipseLink/Development/JPA_2.0/metamodel_api#DI_101:_20100218:_Descriptor.javaClass_is_null_on_a_container_EM_for_a_specific_caseを参照して ください。http://netbeans.org/bugzilla/show_bug.cgi?id=181068も参照してください。

以下の最後の行をpersistence.xmlに追加したところ、修正されました。

<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<!-- Add the following to work around exception issue -->
<exclude-unlisted-classes>false</exclude-unlisted-classes>
于 2011-04-09T22:41:27.997 に答える
9

チャールズが彼の回答で指摘したように、問題は ID の生成ではなく、永続化レイヤーがエンティティを見つけられないことです。

あなたと同じように、私も JPA の初心者です。org.eclipse.persistence.jpa.PersistenceProviderこのエラーが発生したときに使用する「Hello World」JPA アプリケーションを作成しようとしました。上記の回避策も私にとってはうまくいきました。さらに、試行錯誤の結果、エンティティを宣言するには、常に@entity各エンティティに注釈を付ける必要があることもわかりました。

  • に設定exclude-unlisted-classesした場合は、要素true内のエンティティも一覧表示する必要があります。classpersistence.xml
  • 永続層に設定exclude-unlisted-classesすると、要素に関係なくfalseエンティティを見つけることができます。classpersistence.xml
于 2011-05-09T12:12:13.530 に答える
7

TopLinkでは、MySQLに対してGenerationType.IDENTITYを明示的に設定する必要があったため、これを変更してデータベースを削除してください。次に、サンプルをもう一度実行してみてください。さらに、データベース プラットフォームを明示的に設定することもできます。

 <property name="toplink.platform.class.name" 
                    value="oracle.toplink.platform.database.MySQL4Platform"/>

また、リソース ローカル エンティティ マネージャーで適切に機能させるには、Java エージェントを使用して Toplink を実行する必要があることも漠然と覚えています。

ただし、EclipseLinkを使用して例を正常に実行しました(Toplinkは古くなっているため、これを使用する必要があります)。唯一の注意点は、MySQL サーバーが手元になかったため、H2 を使用して実行したことです。依存関係を解決するために、次の 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 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.randompage</groupId>
    <artifactId>sandbox</artifactId>
    <packaging>jar</packaging>
    <version>1.0</version>
    <name>sandbox</name>
    <repositories>
        <repository>
            <id>EclipseLink Repo</id>
            <url>http://www.eclipse.org/downloads/download.php?r=1&amp;nf=1&amp;file=/rt/eclipselink/maven.repo</url>
        </repository>
    </repositories>
    <dependencies>
        <dependency>
            <groupId>javax.persistence</groupId>
            <artifactId>javax.persistence</artifactId>
            <version>2.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>eclipselink</artifactId>
            <version>2.0.0</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.2.130</version>
        </dependency>
    </dependencies>
</project>

そしてこの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="JPATestPU" transaction-type="RESOURCE_LOCAL">
        <provider>
            org.eclipse.persistence.jpa.PersistenceProvider
        </provider>
        <class>org.randompage.MyEntity</class>
        <properties>
            <property name="javax.persistence.jdbc.user" value="johndoe"/>
            <property name="javax.persistence.jdbc.password" value="secret"/>
            <property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
            <property name="javax.persistence.jdbc.url" value="jdbc:h2:~/.h2/testdb;FILE_LOCK=NO"/>
            <property name="eclipselink.ddl-generation" value="create-tables"/>
            <property name="eclipselink.logging.level" value="INFO"/>
        </properties>
    </persistence-unit>
</persistence>

これらの設定により、コードは期待どおりに実行されました。

于 2010-03-05T20:12:07.960 に答える
2

AUTOと入力するのではなく、この構文を使用します

@javax.persistence.Id
@javax.persistence.GeneratedValue(strategy = GenerationType.IDENTITY)

次に、小文字のlを持つIDに単純型「long」を使用します。

private long taskID;

これは無関係かもしれませんが、エンティティに別のテーブル名も指定します。

@javax.persistence.Entity(name = "Tasks")
public class Task implements Serializable
于 2010-03-05T17:53:52.657 に答える
1

私の知る限り、このエラーが発生するたびに、グラスフィッシュを再起動します。いつでも動作します。

于 2011-01-09T18:24:15.357 に答える
1

Web アプリケーションを GlassFish v3 (JPA プロバイダーとして EclipseLink を使用) にデプロイするときに、同じ例外に遭遇しました。上記と同じシナリオかどうかはわかりませんが、私の場合のこのバグの説明は他の人に役立つかもしれません:-) -OSGiで実行している場合(GlassFishの場合)、EclipseLinkにバグがあることがわかりました。 EclipseLink は、再デプロイ時にエンティティ クラスの「古い」バージョンを保持するため、この例外が発生します。バグレポートはこちらです。

于 2010-04-02T18:07:16.057 に答える
1

junitでのみこのエラーが発生する場合

これをpersistence.xmlに追加してみてください

<jar-file>file:../classes</jar-file>
于 2014-12-03T23:24:45.583 に答える
0

EM がテーブルの構築/更新を認識できるように、クラス/テーブルの定義を変更するときに、persistence.xml にもう 1 つの項目を追加する必要もあります。

<property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(SchemaAction=&apos;refresh&apos;)"/>

新たなスタートが必要な場合は、代わりに次を使用します。

<!--<property name="openjpa.jdbc.SynchronizeMappings"
                value="buildSchema(SchemaAction='dropDB,add')"/>
                -->

あなたのpersistence.xmlスキーマ管理では、削除/作成または更新ではなく、「テーブルの作成」のみに設定されていることに気付きました

于 2010-03-05T20:26:07.190 に答える
0

Eclipse のクラス出力フォルダーを確認すると、時々 xml を変更して更新されていませんでした。

于 2012-01-16T16:36:04.377 に答える
0

persistence.xml から定義を除外してみてください。Persistence プロバイダーは、クラスパス内のすべてのクラスをスキャンして @Entity アノテーションを探す必要があります。

于 2010-03-05T19:25:27.950 に答える