2011-11-22 15 views
2

私はC/S Javaプロジェクトに取り組んでおり、Eclipselinkを使ってORM(クライアントサイドキャッシュデータベース、derby)を実行しようとしています。 例&の式でクエリを実行するのは簡単ですが、挿入/更新に関しては、Entity Managerを使用する必要があります(Java ORMでかなり新しい、別の方法があるかもしれません)。 emを作成しようとすると、サーバセッションが必要である(つまり、名前で永続ユニットを見つけることができない)ということを示す例外が常にスローされます。 セッションBean @PersistenceUnitアノテーション&を使用すると、Nullが返されます。Eclipselink Entity Managerの入手方法は?

私はいくつかの愚かな間違いをしましたか?または、値を更新/挿入する簡単な方法はありますか? Session.save(Object)やこのようなことを簡単にするようなものがあるかもしれないと思います。

EDIT:UnitOfWorkを使用しようとしましたが、マップファイルやEclipselinkがID PKを認識させるようなものを変更する必要があります。

@GeneratedValue(戦略= GenerationType.IDENTITYを)

POJOにこの行を追加します動作しません。

EDIT:私はここに値を挿入する作業の使用単位を試してみたが、コード

SessionFactory sessionFactory = new SessionFactory("default"); 
    Session session = sessionFactory.getSharedSession(); 
    UnitOfWork uow = session.acquireUnitOfWork(); 
    SysUser usr2 = new SysUser(); 
    usr2.setUserName("test"); 
    usr2.setUserPassword("test"); 
    uow.registerObject(usr2); 
    uow.commit(); 

だ。しかし、それはここ

Internal Exception: java.sql.SQLSyntaxErrorException: Attempt to modify an identity column 'DB_ID'. 

になり、私が使用した注釈です:

@Column(name = "DB_ID") 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Id 
protected int dbId; 

EntityManagerの場合:

<persistence-unit name="my-app-name"> 
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
<jta-data-source>java:/app/jdbc/jdbc/ConnectionDerbyDS</jta-data-source> 

答えて

8

Java SEアプリケーションでEclipseLink(JPA API経由)を使用する場合、アプリケーションがJava EEコンテナで実行されているコンポーネントで構成されている場合とは少し異なる設定が必要です。

あなたはこれらのような線でEntityManagerを取得:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("my-app"); 
EntityManager em = emf.createEntityManager(); 

そして、あなたのアプリケーションは、アプリケーションのJARファイルのMETA-INFディレクトリにpersistence.xmlファイルを持っている必要があります。このファイルでJPAを構成します。あなたがそこに置くものは、どの永続性プロバイダを使うべきか、あなたのデータベースの接続パラメータは何かをJavaに伝えます。

パーシスタンスユニット名(上記の例では"my-app")は、persistence-unitエレメントに指定されている名前と同じでなければなりません。persistence.xmlです。

persistence.xmlの外観を示すthis EclipseLink exampleを参照してください。

EntityManagerは(EntityManagerを使用する方法を示しthese examplesを参照)を使用すると、データベースにエンティティを保存するために使用することができ、このようなpersist(Object)などのメソッドが含まれています。

あなたのエンティティPOJOは、エンティティIDが含まれています列を持つ必要があり、それは引数なしのコンストラクタを持たなければなりません

@Entity 
public class Example { 

    @Id 
    @GeneratedValue 
    private long id; 

    // ... Add other properties here 

    // Required no-args constructor 
    public Example() { 
    } 

    // ... Add getters and setters here 
} 

追加

あなたは、データベース内のエンティティを保存することができます次のコードのようにEntityManagerを使用してください。 UnitOfWorkを使用する必要があります(私の知る限り、UnitOfWorkが古いJPA 1.0 APIを使用するときに必要なものです。あなたは、JPA 2.0のためにこれを必要としない)いいえ:

entityManager.getTransaction().begin(); 
entityManager.persist(myEntity); 
entityManager.getTransaction().commit(); 
+0

'javax.persistence.PersistenceException:org.eclipse.persistence.jpa.PersistenceProviderという名前のプロバイダで予期しない例外がスローされました:EntityManagerのための持続性なしプロバイダは、私のアプリ名が命名しましたEntityManagerFactoryを作成してください: org.eclipse.persistence.exceptions.PersistenceUnitLoadingException' – MikeZTM

+0

@MikeZTMあなたのクラスパスに必要なすべてのライブラリがありますか? – Jesper

+0

また、Java SEアプリケーションの 'persistence.xml'に' jta-data-source'を使用しないでください。JDBC接続パラメータを指定してください([example](http://wiki.eclipse.org/ EclipseLink/Examples/JPA/OutsideContainer)を参照してください)。 – Jesper

0

あなたは非常に混乱しているようです。おそらく、いくつかの例やチュートリアルを実行して、JPAの学習を始めましょう。

を参照してください、 http://wiki.eclipse.org/EclipseLink/Examples

http://docs.oracle.com/javaee/5/tutorial/doc/bnbpz.html

+0

UnitOfWorkは、INSERT INTO APP.SYS_USER(DB_ID、CREATED、STATUS、USER_NAME、USER_PASSWORD)の値を挿入します。\t bind = > [0、null、null、testinsert、test] ' BUT DB_ID列は、Derbyによって自動的に生成されるID列で、' INSERT INTO APP.SYS_USER(USER_NAME、USER_PASSWORD)VALUES(?、?) \t bind => [testinsert、test] ' この問題を扱うマップファイルなどを編集する方法はありますか? – MikeZTM

関連する問題