Hatena::Groupprogram

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

2017/02/11 (Sat)

今週の月曜日

|  今週の月曜日 - ひとり開発日記。 を含むブックマーク はてなブックマーク -  今週の月曜日 - ひとり開発日記。

「2017/01/01は日曜日なので、"今週の月曜日"なら2017/01/02になりますよ」ってコメントしようと思ったのですが、どうにもこうにもクソリプっぽかったので、自分の日記に書きます。

解決策として、「今日が日曜日なら本日、そうでないなら前の日曜日に戻る」→「次の月曜日を求める」で、2017/01/01週の月曜日を求めると、Java8だと、日時APIを使用して、以下のようにするのがいいのですかね。

package test;

import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;

import java.time.DayOfWeek;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;

import org.junit.Test;

public class ThisMondayTest {
    @Test
    public void testThisMonday() {
        String date = ZonedDateTime.of(2017, 1, 1, 0, 0, 0, 0, ZoneId.of("Asia/Tokyo"))
                .with(TemporalAdjusters.previousOrSame(DayOfWeek.SUNDAY))
                .with(TemporalAdjusters.next(DayOfWeek.MONDAY))
                .format(DateTimeFormatter.ISO_LOCAL_DATE);
        assertThat(date, is("2017-01-02"));
    }
}

このAPIGroovyを使って書き直せばいいのではないでしょうか。*1

*1:すみません、Groovy全然分からないんですよね。 Gradleも触ったこと無いくらいなので…。

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

2016/02/29 (Mon)

jOOQは楽しいですね。

| jOOQは楽しいですね。 - ひとり開発日記。 を含むブックマーク はてなブックマーク - jOOQは楽しいですね。 - ひとり開発日記。

まぁ、タイトルで出落ちですが。

また一人開発始めてるんですが、アーキテクチャ選定やるんですよね。

で、永続層/ORMが悩む訳です。 正直、JPA2.xは、使いづらい…。 コストかけて学習したのに*1、あの実地で使えない感じは、ホント嫌だなぁ、とか思うんですよねー。

で、上記スライド見て、「なんつー、今の俺」とか思うんです*2

それでもって、試すと、S2JDBCを初めて触った時のワクワク感、「これで、タイプセーフ+流れるようなI/Fで、バグもすぐ見つけられて、ハマりも少ない!!」を思い出ささてくれるんですよね。 まぁ、しばらく使ってみますかねー。

*1金魚本って、何だったんでしょうね…??? http://amazon.jp/dp/4798124605

*2:まぁ、JavaのORMのバリエーションが少なくて、開発/イノベーションが停滞してる、ということなんですがー…

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

2015/10/01 (Thu)

EclipseLink/JPAのエンティティクラスから作成したDDLを、flywayでマイグレーション

| EclipseLink/JPAのエンティティクラスから作成したDDLを、flywayでマイグレーション - ひとり開発日記。 を含むブックマーク はてなブックマーク - EclipseLink/JPAのエンティティクラスから作成したDDLを、flywayでマイグレーション - ひとり開発日記。

EclipseLink/JPAのエンティティクラスから、CREATE TABLEのDDLを、Mavenで作成 - ひとり開発日記。 - プログラマの秘密のあれこれ の続きです。

DBマイグレーションツールflywayは、Mavenプラグイン形式でも提供されているので、別個インストールしなくても、pom.xmlに記述するだけで実行OKなんですね。

そして、結構面倒くさいConfiguration設定も、必要なだけ properties の中で flyway.*** 形式で記述するだけで良いのです。

    <properties>
        <flyway.url>jdbc:mysql://127.0.0.1:3306/testdb</flyway.url>
        <flyway.user>testuser</flyway.user>
        <flyway.password>testpassword</flyway.password>
        <flyway.locations>filesystem:${project.basedir}/db/migration</flyway.locations>
    </properties>

    <build>
        <plugins>
             <plugin>
                <groupId>org.flywaydb</groupId>
                <artifactId>flyway-maven-plugin</artifactId>
                <version>3.2.1</version>
                <dependencies>
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>5.1.36</version>
                    </dependency>
                </dependencies>
            </plugin>
       </plugins>
    </puild>

JDBCURL、ユーザー、パスワードDBのドライバーは、それぞれ自分の環境に合わせて頂いて…。

mvn flyway:migrate

上記を実行すると、DDLDBに流し込まれて、各種テーブルが出来上がります。

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

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

2015/09/09 (Wed)

Guice-Persistで、トランザクションが有効にならない その2

| Guice-Persistで、トランザクションが有効にならない その2 - ひとり開発日記。 を含むブックマーク はてなブックマーク - Guice-Persistで、トランザクションが有効にならない その2 - ひとり開発日記。

Google Guice/Guice-Persist*1 + EclipseLink(JPA) + Querydsl でアプリケーションを作っていて、「あれれ?トランザクションが有効にならない」と言うような目に…。

@Singleton
public class AccountLogic {

	@Transactional
	public void add(String name, String mail) {
		// do something
	}
}

これ、最初どこが悪いのか、サッパリだったんですけどね。

早い話、トランザクション境界メソッドに付ける @Transactional は、 @com.google.inject.persist.Transactional が正解。 JTA標準の @javax.transaction.Transactional だと動かない、と言うことです。 EclipseLinkをMavenで入れると、依存関係解決で @javax.transaction.* が入っちゃうので、誤りがち、と言う話でした。

*1Guice 4.0

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