OpenJPAでエンハンスできない件。

いろいろありすぎて疲れたので、すっごい書き殴り。
同じ問題にぶつかる人はまずいないでしょうが、メモしときます。
前提はMaven3+Eclipse kepler +OpenJPA2.2.2+テスト実行です。サーバのほうはまた別、ということで。

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="SystemAccount"
		transaction-type="RESOURCE_LOCAL">
		<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
		<class>.......</class>
		<properties>
			<property name="openjpa.ConnectionDriverName" value="org.mariadb.jdbc.Driver" />
			<property name="openjpa.ConnectionURL" value="jdbc:mysql://localhost:3306/database" />
			<property name="openjpa.ConnectionUserName" value="root" />
			<property name="openjpa.ConnectionPassword" value=<passwd> />
			<property name="openjpa.ConnectionFactoryProperties"
				value="PrettyPrint=true, PrettyPrintLineLength=72, PrintParameters=true, MaxActive=10, MaxIdle=5, MinIdle=2, MaxWait=60000" />
			<property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)" />
			<property name="openjpa.DynamicEnhancementAgent" value="false" />
			<property name="openjpa.RuntimeUnenhancedClasses" value="supported" />
			<property name="openjpa.Log" value="DefaultLevel=INFO,SQL=TRACE" />
			<property name="openjpa.LockManager" value="pessimistic" />
			<property name="openjpa.MaxFetchDepth" value="3" />
			<property name="openjpa.LockTimeout" value="30000" />
		</properties>
	</persistence-unit>
</persistence>

こんなんやってると、だいたいproperty name=”openjpa.RuntimeUnenhancedClasses” のエンハンスでこけます。もともとsupportedは非推奨なんですな。デフォルトの値はunsupported。
たいていは-javaagentでOpenJPAのjarを指定するらしいんですが、これがうまくいかないケースが結構あるようで、某スタックが漏れちゃうところでも「バグ多いからそもそも使うな!」なんてのがベストアンサーになってたりします。

何もしないで実行するとだいたいこんな風に怒られます。

重大: null
<openjpa-2.2.2-r422266:1468616 fatal general error> org.apache.openjpa.persistence.PersistenceException: null
	at org.apache.openjpa.enhance.ClassRedefiner.redefineClasses(ClassRedefiner.java:96)
	at org.apache.openjpa.enhance.ManagedClassSubclasser.prepareUnenhancedClasses(ManagedClassSubclasser.java:176)
	at org.apache.openjpa.kernel.AbstractBrokerFactory.loadPersistentTypes(AbstractBrokerFactory.java:314)
	at org.apache.openjpa.kernel.AbstractBrokerFactory.initializeBroker(AbstractBrokerFactory.java:238)
	at org.apache.openjpa.kernel.AbstractBrokerFactory.newBroker(AbstractBrokerFactory.java:212)
	at org.apache.openjpa.kernel.DelegatingBrokerFactory.newBroker(DelegatingBrokerFactory.java:156)
	at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:227)
	at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:154)
	at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:60)
	... more

で、解決策は公式にも乗っていて、Mavenのプラグインがあるので、それを入れます。

   <plugin>
        <groupId>org.apache.openjpa</groupId>
        <artifactId>openjpa-maven-plugin</artifactId>
        <version>2.2.2</version>
        <configuration>
            <includes>**/model/*.class</includes>
            <excludes>**/model/XML*.class</excludes>
            <addDefaultConstructor>true</addDefaultConstructor>
            <enforcePropertyRestrictions>true</enforcePropertyRestrictions>
        </configuration>
        <executions>
            <execution>
                <id>enhancer</id>
                <phase>process-classes</phase>
                <goals>
                    <goal>enhance</goal>
                </goals>
            </execution>
        </executions>
        <dependencies>
            <dependency>
                <groupId>org.apache.openjpa</groupId>
                <artifactId>openjpa</artifactId>
                <!-- set the version to be the same as the level in your runtime -->
                <version>2.2.2</version>
            </dependency>
        </dependencies>
    </plugin>

バージョンはお使いのOpenJPAのバージョンに合わせてください。
ゴールの「enhancer」はm2eでライフサイクルがサポートされてないとエラーが出るので、クイックフィックスで無視する設定を入れてあげてください。
公式そのまんまの情報ですが、日本語少ないのでとりあえず書いておきます。

広告
カテゴリー: お仕事, プログラミング タグ: , , パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中