2013-06-07 14 views
11

永続性のためにEclipseLinkでJava EE 6を使用する作業アプリケーションと、PostgreSQLデータベースがあります。私はPostgreSQLでパスワードを設定したいユーザー登録用のJava EE 6のJPA2 EntityManagerからDataSourceまたはConnectionを取得する方法

:私はこのためにDigestUtilsを使用するカントのよう

... password = crypt('inputPassword',gen_salt('bf')) ... 

、私はDBに手動でユーザーを挿入する必要があります。

DataSource ds = entityManagerInstance.someFunctionThatReturnsADataSourceOrConnection(); 

それともcreateNativeQueryかを使用することも可能である:私は次のようにEntityManagerの から何とか InitialContextInstance.lookup(dataSource)でデータソースを照会するが、それ(または接続)を抽出したくない設定可能な自分のアプリケーションを維持するために 注射から守るために用意された声明と結婚式の の何か類似していますか?

+0

に基づいて、Hibernateは4で動作するコードのスニペットですJPA設定用のデータソースを使用すると、アクセスできるようになりますそれを '@Resource(name =" myDb ")DataSource myDB'を使って呼び出します。そうじゃない?そして、あなたはJPAでパラメトリッククエリを定義することもできると思います。 –

+0

はい、それはうまくいくかもしれませんが、私はまだ名前を知る必要があります。私は注入されたEntityManagerのために構成されたデフォルトのDataSourceを取得したい。 – zuloo

答えて

15

時にはそれはGoogleだけで別の実行取る:受け入れ答えに「アルキメデストラハノ」のコメントに応えてEclipse Link Documentation

+5

標準のその部分です。 Eclipselinkに固有のようです –

+0

この接続からパスワードを取得する方法はありますか –

+2

休止状態では機能しません。 – okwap

4

で説明したように他のための受け入れ答え作業をより行い、

entityManager.getTransaction().begin(); 
java.sql.Connection connection = entityManager.unwrap(java.sql.Connection.class); 
... 
entityManager.getTransaction().commit(); 

をEclipselink?答えは、少なくともHibernateではいいえです。私は休止状態のために受け入れ答えをしようとしたとき

私は、次のエラーを得た:

Caused by: org.springframework.orm.jpa.JpaSystemException: Hibernate cannot unwrap interface java.sql.Connection; nested exception is javax.persistence.PersistenceException: Hibernate cannot unwrap interface java.sql.Connection 
    at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:418) ~[spring-orm-4.0.5.RELEASE.jar:4.0.5.RELEASE] 

を以下のstackoverflowの質問からの回答の組み合わせは、私は休止状態のために働く解決策を考え出すことができました。ここで

Get hold of a JDBC Connection object from a Stateless Bean

Hibernate get Connection object for JasperRunManager

私の解決策である:ここでは

Session hibernateSession = entityManager.unwrap(Session.class); 

    hibernateSession.doWork(new org.hibernate.jdbc.Work() { 

     @Override 
     public void execute(Connection connection) throws SQLException { 
      // do whatever you need to do with the connection 
     } 
    }); 
0

はあなたの場合はデュロンの答え

Connection getConnection() { 
     Session session = entityManager.unwrap(Session.class); 
     MyWork myWork = new MyWork(); 
     session.doWork(myWork); 
     return myWork.getConnection(); 
} 


private static class MyWork implements Work { 

    Connection conn; 

    @Override 
    public void execute(Connection arg0) throws SQLException { 
     this.conn = arg0; 
    } 

    Connection getConnection() { 
     return conn; 
    } 

} 
関連する問題