2007年7月20日金曜日

JBoss Seam の @Generated

これも解決したのに、メモしておかなかったので備忘録。 

@Generated は @Id の所では使えないようです。 
結局、下のようにして私の必要としている結果は出せています。

これで、
  a) Unique Id はDBのsequenceで作られたものを select nextvalue('xxx')で取得して使う。
PostgreSQLのserialでは、冗長な動作となるけど、諦める。(PostgreSQL独自なので、
対応は期待できない?)
システムが振るIdなので、ここに勝手に書き込むことは出来ない、エラーになる。
seam-gen が作ったdefaultの入力画面では、0が表示されていますが、これを消してしまうと、
    「Nullはダメだよ!」というエラーが出ます。また、勝手な値を入れると debug.pageへ飛ん
    でしまいます。(これは入力出来ないようにしておくべきなので、これでも良しとする)。

b) triggerを利用したtimestampはDBでinsert/updateの時に付けられる。強制的に値
を入れても、システムのtriggerで作られた値で上書きされる(エラーは出ない)。

といった動作をしています。

マニュアルの読み方が十分でなかった為に、余計なご迷惑を掛けたかもしれません。失礼しました。

使用したPostgreSQLのテーブル
Table "public.users"
Column | Type | Modifiers
-----------+---------+----------------------------------------------------
id | integer | not null default nextval('users_id_seq'::regclass)
name | text | not null
address | text | not null
email | text |
tel | text |
last_user | name |
last_date | date |
Indexes:
"users_pkey" PRIMARY KEY, btree (id)
Triggers:
user_stamp BEFORE INSERT OR UPDATE ON users FOR EACH ROW EXECUTE PROCEDURE user_stamp()

使用した Users.java (Entity Bean)

package jp.tydfam.test1;
// Generated 2007/07/05 20:19:51 by Hibernate Tools 3.2.0.b9

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import org.hibernate.annotations.Generated;
import org.hibernate.annotations.GenerationTime;
import org.hibernate.validator.NotNull;

/**
* Users generated by hbm2java
*/
@Entity
@Table(name = "users", schema = "public")
public class Users implements java.io.Serializable {

private int id;
private String name;
private String address;
private String email;
private String tel;
private String lastUser;
private Date lastDate;

public Users() {
}

: : :
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_GEN")
@SequenceGenerator(name="SEQ_GEN",sequenceName="users_id_seq", allocationSize=1)
//上の2行を seam-genで作られたコードに追加 sequenceNameはDBのsequenceの名前
// allocationSizeの意味がよくわかっていませんが、、、、
@Column(name = "id", unique = true, nullable = false, insertable=false,updatable=false)
@NotNull
public int getId() {
return this.id;
}

public void setId(int id) {
this.id = id;
}
: : :
: : : (省略)
: : :
@Column(name = "last_user")
public String getLastUser() {
return this.lastUser;
}

public void setLastUser(String lastUser) {
this.lastUser = lastUser;
}
@Temporal(TemporalType.DATE)
@Generated(GenerationTime.ALWAYS)
     // 上の1行を追加
@Column(name = "last_date", length = 13, insertable=false, updatable=false)
     // GenerationTime.ALWAYS/INSERT に対応して、
insertable/updatableにfalseを指定しないとエラーになる。
public Date getLastDate() {
return this.lastDate;
}

public void setLastDate(Date lastDate) {
this.lastDate = lastDate;
}

}

2007年7月5日木曜日

Seam (2.0b) と @Generated

seam-gen で既存のDBからコードを起こす場合に、DBで今までふられていたId等の処理の対応が問題になります。 Hibernate のマニュアルやら、Annotationのマニュアルやら読みながら、「どうしたら良いのか」いろいろいじってみました。
@Entityの@Idには@GeneratedValueを使うみたいです。 マニュアルから、@Generatedが使えるのかと思っていましたが、NPEが出ます。
PostgreSQLの場合下のような感じです。 (PostgreSQLのserialをDBでは使っていますので、sequenceにすると冗長な処理 select nextval('??')が発生していますが、やむを得ません。)
また、これで入力画面(デフォルトで出来た物なのでIdの入力欄が有る)でIdを指定するとエラーになります。 また、ブランク(NULL)だとエラーが出ます。 デフォルトで0が表示されていますが、この状態で、他の項目を入力すると、ちゃんと続き番号を取ってきて入れてくれています。

Idをふるケースはこれで良いのですが、triggerを使ってtimestampしている所は、どうしたら良いのか、また少し実験してみることにします。

入力は日本語で出来るのですが、searchの所に日本語入れると化けるので、これも原因を調べて直さなければなりません。

seam は楽しい(楽)けど、ちゃんと思い通りに使えるようになるのにはもう少々お時間が掛かりそう、、、、

/**
* Users generated by hbm2java
*/
@Entity
@Table(name = "users", schema = "public")
public class Users implements java.io.Serializable {

@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_GEN")
@SequenceGenerator(name="SEQ_GEN",sequenceName="users_id_seq", allocationSize=1)
^^^^^^^^^
                              ここに、serial で作られたsequeceの名前を入れる

@Column(name = "id", unique = true, nullable = false, insertable=false, updatable=false)
@NotNull
private int id;

@Column(name = "name", nullable = false)
@NotNull
private String name;

@Column(name = "address", nullable = false)
@NotNull
private String address;
: : : :
(getter/setter が続く)

FreeBSD-current の Java(jdk15)

6/29日のソースで作ったシステム上では jdk1.5.0はうまくコンパイル出来て、動作上も問題ないようですが、6/30日以降のソースから作ったシステムの上ではコンパイルができません。 cvs diff してみたのですが、関連が有りそうな物のアップデートは行われておらず、brain damage状態です。
gcc4.2.0のバグがいろいろ言われているので、ここのアップデートが終わってから再度確認することにします。 (一応動いているので、もうあまりいじりたくもないけれど、気持ち悪いので、、、、)

php のインストールの確認

phpって最初のfacebook書くときに使われたみたいで、それなりに歴史のある言語で、私も2006年位から使っていますが、CLIで使う事はあまり無いので、apacheとの連携のトラブル(mod_phpのバージョンの齟齬)などは気になりますが、拡張モジュールのインストールの問題に...