Hatena::Groupprogram

ひとり開発日記。 このページをアンテナに追加 RSSフィード

2015/09/23 (Wed)

EclipseLink/JPAのエンティティクラスから、CREATE TABLEのDDLを、Mavenで作成

| EclipseLink/JPAのエンティティクラスから、CREATE TABLEのDDLを、Mavenで作成 - ひとり開発日記。 を含むブックマーク はてなブックマーク - EclipseLink/JPAのエンティティクラスから、CREATE TABLEのDDLを、Mavenで作成 - ひとり開発日記。

  1. JPA2.1形式のエンティティクラスを作成
  2. そのエンティティクラスから、CREATE TABLE文のDDLを自動作成
  3. DDLDBに流して、テーブル作成

上記のようなこと、早い話Seasar2でのS2JDBC-Genのようなことを、JPA2.1環境でやりたかったのですが、なかなか大変でした…。*1

結局、eclipselink-ddlgeneration-maven-pluginを使って、DDLを作成するのが簡単、と言うことに。

  • src/main/resources/META-INF/persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
	version="2.1">
	<persistence-unit name="testdb" transaction-type="RESOURCE_LOCAL">
		<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
		<exclude-unlisted-classes>false</exclude-unlisted-classes>

		<properties>
			<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
			<property name="javax.persistence.jdbc.url" value="jdbc:mysql://127.0.0.1:3306/testdb" />
			<property name="javax.persistence.jdbc.user" value="testuser" />
			<property name="javax.persistence.jdbc.password" value="testpassword" />

			<!-- Logging -->
			<property name="eclipselink.logging.level" value="INFO" />
			<property name="eclipselink.logging.timestamp" value="true" />
			<property name="eclipselink.logging.session" value="true" />
			<property name="eclipselink.logging.thread" value="true" />
			
			<!-- add semicolon -->
			<property name="eclipselink.ddlgen-terminate-statements" value="true" />
		</properties>
	</persistence-unit>
</persistence>

eclipselink.ddlgen-terminate-statements プロパティに true を設定しておくと、CREATE文の末尾に、セミコロンが付加され、一気にDDLが流せるようになるのです。*2

	<build>
		<plugins>
			...
			<plugin>
				<groupId>us.hornerscorners.mojo</groupId>
				<artifactId>eclipselink-ddlgeneration-maven-plugin</artifactId>
				<version>1.8</version>
				<configuration>
					<jdbcDriver>com.mysql.jdbc.Driver</jdbcDriver>
					<jdbcUrl>jdbc:mysql://127.0.0.1:3306/testdb</jdbcUrl>
					<jdbcUser>testuser</jdbcUser>
					<jdbcPassword>testpassword</jdbcPassword>
					<outputDir>db/migration</outputDir>
					<createFilename>V2__schema.sql</createFilename>
					<deleteFilename>drop-schema.sql</deleteFilename>
					<unitName>testdb</unitName>
				</configuration>
				<executions>
					<execution>
						<id>ddl-generation</id>
						<goals>
							<goal>execute</goal>
						</goals>
						<phase>process-classes</phase>
					</execution>
				</executions>
				<dependencies>
					<dependency>
						<groupId>mysql</groupId>
						<artifactId>mysql-connector-java</artifactId>
						<version>5.1.36</version>
					</dependency>
					<dependency>
						<groupId>org.eclipse.persistence</groupId>
						<artifactId>org.eclipse.persistence.jpa</artifactId>
						<version>2.6.0</version>
					</dependency>
				</dependencies>
			</plugin>
		</plugins>
	</build>

pom.xml に eclipselink-ddlgeneration-maven-plugin の設定を書きます。 ここで注意して欲しいのが、プラグイン内の依存関係に、EclipseLinkの2.6.0を指定しないと、CREATE文の末尾に、セミコロンが付加されないのです。 ソースコードコンパイルの依存関係と、プラグイン内の依存関係が別なので、注意が必要ですね。

後、DDLJAR/WARに含めたくないので、outputDirは、プロジェクト直下に db/migration というディレクトリを作って、そこに書き出すようにし、CREATE文のファイル名は、flywayで実行しやすいように、"V2__***.sql"としています。

mvn process-classes

pom.xml と同じディレクトリで、上記コマンド実行すると、DDLファイルが書き出されます。

*1:「金魚本」 asin:4798124605 にも載ってないですしね

*2:EclipseLinkのDDLにsemicolonを付与する | Monotalk http://www.monotalk.xyz/blog/eclipselink%E3%81%AEddl%E3%81%ABsemicolon%E3%82%92%E4%BB%98%E4%B8%8E%E3%81%99%E3%82%8B/

トラックバック - http://program.g.hatena.ne.jp/halflite/20150923