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;
}

}

0 件のコメント:

PCをWindows11にアップグレード(ハードもRyzen9 9900x+4070TiSに)

remBG(背景を消すPysonのユーティリティ)を弄っていたら、記事に書かれているのと比べてやたらスピードが遅いので、購入履歴を調べてみると、3~4年経ってしまっている。  ここは、奮起して、Ryzen9 9900x+Asus Prime X870-P WIFI-CSM +As...