0

データベース (mssql または h2) にアクセスするためのスタンドアロン アプリを作成しました。接続の詳細を渡してサーバーに接続するヘルパー クラスを作成しました。

すべて正常で、想定どおりに動作します。

コードを Eclipse プラグイン (->OSGi) に移動すると、最初に Driver Not Found エラーが発生しましたが、ClassLoader を PersistenceProvider に渡すことでこれを修正しました。

次の問題が発生しましたが、解決できません。永続化ユニット名とマップを渡してcreateEntityManagerFactoryを呼び出すと、PersistenceProvider がnullを返します。

例外をスローしません...単にnullを返します

ドライバーが見つかったと思います...スタンドアロンアプリケーションが動作しているため、persistence.xmlにすることもできません...

何か案は?

ここに私のpersistence.xml

<?xml version="1.0" encoding="UTF-8" ?>
<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"
  version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
  <persistence-unit name="EclipseLinkTest" transaction-type="RESOURCE_LOCAL">
  <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<!--   <mapping-file>META-INF/contact-orm.xml</mapping-file>     -->
    <properties>
<!--       <property name="javax.persistence.jdbc.driver" value="org.h2.Driver" /> -->
<!--       <property name="javax.persistence.jdbc.url" value="jdbc:h2:D:/JAVA/Final/lumo.osgi.service.eclipselink.impl/db/embedded.db" /> -->
<!--       <property name="javax.persistence.jdbc.user" value="admin" /> -->
<!--       <property name="javax.persistence.jdbc.password" value="admin" /> -->

<!--       <property name="javax.persistence.jdbc.driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" /> -->
<!--       <property name="javax.persistence.jdbc.url" value="jdbc:sqlserver://dbserverIP:1433;DatabaseName=testsystem" /> -->
<!--       <property name="javax.persistence.jdbc.user" value="editor" /> -->
<!--       <property name="javax.persistence.jdbc.password" value="editorpwd" /> -->


      <!-- EclipseLink should create the database schema automatically -->
<!--       <property name="eclipselink.ddl-generation" value="drop-and-create-tables" /> -->
<!--       <property name="eclipselink.ddl-generation" value="create-tables" /> -->
<!--       <property name="eclipselink.ddl-generation.output-mode" value="database" /> -->
<!--       <property name="eclipselink.weaving" value="true"/> -->
      <property name="eclipselink.logging.level" value="WARNING"/>
    </properties>

  </persistence-unit>
</persistence> 

これは構成を取得するためのコードです (アプリケーションはメイン クラスなので、そのクラス ローダーはターゲット定義のすべてに関する情報を取得します)。

public Properties getEmbeddedConfiguration(String path, String database,
            String login, String password) {
        Properties props = new Properties();
        // this one is for getting started in OSGi & JPA

        // No suitable driver found for jdbc:h2:file:C:\temp\Thumbs.db;IFEXISTS=TRUE
//      props.put(PersistenceUnitProperties.CLASSLOADER,
//              EclipseLinkServiceImpl.class.getClassLoader());
        // this fixes the driver not found but leaves a nullpointer
        props.put(PersistenceUnitProperties.CLASSLOADER,
                Application.class.getClassLoader());

         String connectionString = String.format(
         "jdbc:h2:file:%s%s;IFEXISTS=TRUE", path, database);
         props.put("javax.persistence.jdbc.driver", "org.h2.Driver");
         props.put("javax.persistence.jdbc.url", connectionString);
         props.put("javax.persistence.jdbc.user", login);
         props.put("javax.persistence.jdbc.password", password);

         props.put("eclipselink.target-database",
         "org.eclipse.persistence.platform.database.H2Platform");
         props.put("eclipselink.ddl-generation", "drop-and-create-tables");
         props.put("eclipselink.ddl-generation.output-mode", "database");
        return props;
    }

最後になりましたが、作成部分

PersistenceProvider p = new PersistenceProvider();
factory = p.createEntityManagerFactory(PERSISTENCE_UNIT_NAME,
getEmbeddedConfiguration(folder, database, username, pwd));
System.out.println("factory: " + factory);
em = factory.createEntityManager();
4

1 に答える 1

0

OSGi で JPA を実行するには、Gemini プロジェクトを参照してください。

于 2013-06-26T23:40:46.660 に答える