1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

EclipseLink JPAでの自動トリムを止める方法

Posted at

背景

最近仕事でWebSphere Liberty (Open Liberty)を利用する事になりましたが、JPAでデータベースの項目を取得するときに標準ではCHAR型のスペースが自動トリムされていることが判明しました。CHAR(3)の項目に、"a  "(後ろにスペース2つ)や"   "(スペース3つ)を意図的に設定しているときに、"a"や""(空文字列)と取得されてしまいます。調べると、これはEclispeLinkの標準仕様だそうで。

#Solution
persistence.xmlかなにかの設定で簡単に変更できると思いきや単純な設定はなさそうでした。はまってしまいましたが、その解決方法としてはSessionCustomizerを作成する必要がありました。

###SessionCustomizerの作成
JavaEE APIでの対応が難しく、EclipseLinkのAPIを利用した制御が必要です。

import org.eclipse.persistence.config.SessionCustomizer;
import org.eclipse.persistence.sessions.Session;

public class YOURSessionCustomizer implements SessionCustomizer{
	public void customize(Session session) {
		session.getLogin().setShouldTrimStrings(false);
	}
}

###persistence.xmlの設定

<persistence version="2.1" 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">
<!-- 中略 -->
	<persistence-unit name="ABC" transaction-type="JTA">
<!-- 中略 -->
		<properties>
			<!-- EclipseLink settings -->
			<property name="eclipselink.validate-existence" value="true"/>
			<property name="eclipselink.logging.level" value="ALL" />
			<property name="eclipselink.logging.sql" value="ALL"/>
			<property name="eclipselink.logging.level.sql" value="ALL"/>
			<property name="eclipselink.logging.parameters" value="true"/>
<!-- 追加したところ -->
			<property name="eclipselink.session.customizer" value="package.YOURSessionCustomizer"/>
<!-- 追加したところ -->
		</properties>
	</persistence-unit>
</persistence>

###Libertyのserver.xmlの設定変更

<server>
<!-- 中略 -->
    <webApplication contextRoot="app" id="webapp" location="webapp.war" name="webapp">
        <classloader apiTypeVisibility="spec, ibm-api, stable, third-party" />
    </webApplication>
</server>

参考:Java EE アプリケーションからのサード・パーティー API へのアクセス
https://www.ibm.com/support/knowledgecenter/ja/SSEQTP_liberty/com.ibm.websphere.wlp.doc/ae/twlp_classloader_3p_apis.html

###(option)pox.xmlの修正
EclipseLinkのAPIのが必要ですので、プロジェクトのクラスパスの通し方に応じて設定してください。
EclopseLinkはLibertyに含まれますのでprovidedにしてます。

        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>eclipselink</artifactId>
            <version>2.6.9</version>
            <scope>provided</scope>
        </dependency>
1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?