ラベル java の投稿を表示しています。 すべての投稿を表示
ラベル java の投稿を表示しています。 すべての投稿を表示

2011/04/20

JPAでbooleanをマッピングする

環境: Hibernate 3.6.3, PostgreSQL 8.4.7

JPAでbooleanをDBのBOOLEAN型にマッピングできるのかを試したら、普通にできた。


@Entity
public User {
    @Id
    private int id;
    @Column
    private boolean valid;

    public boolean isValid() {
        return valid;
    }
 
    public void setValid(boolean valid) {
        this.valid = valid;
    }



できて当然といえば当然だけどね。ちょっとうれしい。

しかし、BOOLEAN型ではない型を使ってブール値を保存しているような既存システムのDBに対してJPAでマッピングするには、値を変換する処理を書く必要があるようだ。

変換処理はWikibooksのJava Persistence/Basic Attributesやここで紹介されている。これは面倒でスマートではない。

そんな面倒な変換処理をAnnotationで生成してくれる、Boolean Magic Converterというのを作っている人がいた。あるプロジェクトの一部品だが、BooleanMagicProcessorFactory.jar だけ個別にダウンロードできるようになっている。
こんな感じで書ける。


@BooleanMagic(trueValue = "T", falseValue = "F",
columnName = "VALID", ifNull = ReturnType.FALSE)
private transient Boolean valid;


Hibernateではorg.hibernate.annotations.Typeで次の型がある。

@Type(type="yes_no") ... Y/N
@Type(type="true_false") ... T/F

1/0はないのか...と思った。一応 org.hibernate.usertype.UserType を実装すれば、1/0を@Typeで指定できるようになりそうだが、いずれにせよ他のアプリケーションサーバで動かすことになったときHibernate依存だと困るので避けたい。

2011/04/19

Struts2 ConventionとTilesのJSP検索パス

環境: Struts 2.2.1.1, Tiles 2.2.2

Struts2 ConventionとTilesを一緒に使うときの話。

Conventionが.jsp を検索するパスはデフォルトで /WEB-INF/content (constant: struts.convention.result.path) だが、Tilesは Context Root から検索する。Tilesの方はソースを追ってみた限りでは、templateに共通のプリフィックスを付加するような処理はなく、templateの値がそのままdispatchされるようだ。

できる限り設定の追加は避けたいので、Tiles のパスを長々と書くことにした。

tiles.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE tiles-definitions PUBLIC
"-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
"http://tiles.apache.org/dtds/tiles-config_2_0.dtd">

<tiles-definitions>

<definition name="/main.tiles" template="/WEB-INF/content/main.jsp">
<put-attribute name="body" value="/WEB-INF/content/body.jsp" />
<put-attribute name="footer" value="/WEB-INF/content/footer.jsp" />
</definition>

</tiles-definitions>



template attribute の /WEB-INF/conent を書かずに済む方法があれば、すっきりするのだが。

2011/04/16

Eclipse WTPのTomcatが出力するログを設定する

環境: Eclipse 3.6 Helios, Tomcat 6.0, JDK 6

Eclise WTPで起動するTomcatが使用するlogging.propertiesはJDKデフォルトのファイルである。
OpenJDK 6 Linuxの場合は /etc/java-6-openjdk/logging.properties。

これを変更するには、Run Configurations の Apache Tomcat で、VMの引数を追加する。

    -Djava.util.logging.config.file="logging.propertiesのパス"

Hibernateのデバッグログを出力したかったので、次の行を追加した。

    org.hibernate.level=FINEST

EclipseでTomcatの起動タイムアウトを設定する

環境: Eclispse 3.6 Helios, Tomcat 6.0

EclipseでTomcatをデバッグ起動し、起動完了する前にどこかブレークポイントで止めておくと、45秒でタイムアウトになりデバッグが終了してしまう。初期化処理をデバッグするときに困った。

メッセージ:
Server Tomcat v6.5 Server at localhost was unable to start within 45 seconds.
If the server requires more time, try increasing the timeout in the server editor.

これを回避するには、Server Viewで目的のサーバをダブルクリックしてServer Editorを開き、Timeouts - startの項目を編集すれば良い。とりあえず600秒にしておいた。

Struts2 Convention Pluginとsubmitタグ

環境: struts2-2.2.2.1

今ではdeprecatedなCodebehind Pluginではできたのだが、Struts2 Convention Pluginはsubmitタグのmethod attributeを見てくれない。

Actionクラスのexecute()以外に実行したいメソッドがある場合は、@Actionで指定するポリシーのようだ。リクエストパラメータでメソッドの区別をするのではなく、URLで区別するということだ。
理由は知らないけど、Codebehindではsubmitの値次第で、意図しないpublicメソッドが呼べてしまうしね。
@Actionならば、指定したメソッドだけが呼び出し対象になる。

それでConvention Pluginでは次のとおり。
submitのactionを指定して、その値を@Actionの引数に対応させる。
submitが1つのときはformのactionに指定しても良い。
ただし複数のsubmitが存在する場合は、submitのactionを使ってそれぞれ異なるURLを指定する。

.jsp

<s:form> 
<s:submit action="hoge" value="Hoge">
<s:form>


Action Class

@Action("hoge") 
public String hoge() {
...
}