[Seasar-user:12325] [Seasar][S2JDBC]GenerationType.SEQUENCEによるIDの取得
sato
[E-MAIL ADDRESS DELETED]
2007年 12月 27日 (木) 16:13:23 JST
お世話になります。NSQ@佐藤です。
Seaser2.4.19,2Tiger-2.4.19を使用してOracle10gへのデータ更新を行っていま
す
そこで質問なのですが、複数のデータを同じテーブルに更新する際、常にデータ
ベースのSequenceを利用してIDを取得したいのですが、どのように行ったら良い
かご存知の方がいらっしゃいましたら、ご教授下さいませんでしょうか?
■発生している問題
S2JDBCを利用したinsertで1件目はIDを{Entity}.nextval from dualでデータ
ベースから取得出来ているのですが、2件目以降はnextvalせず、IDの最大値+1で
データを登録してしまいます。
これにより、データベースのSequenceと登録されているIDに不整合が起きていま
す。
2件目以降は、org.seasar.extension.jdbc.id.AbstractPreAllocateIdGenerator
#getIdContextで1つ前に登録したIDを取得して、そのIDに1加算した値を次のID
としているようなのですが、GenerationTypeの設定がSEQUENCEの場合は、IDに1
加算ではなく、新たなIDをデータベースより取得するようにしたいのですが、如
何したら良いでしょうか?
何か、設定に不備があるのかな?と、思いつつも現在はorg.seasar.extension.
jdbc.id.SequenceIdGeneratorでgetIdContextをOverrideして強制的にデータ
ベースよりIDを取得するようにしています。
他にもっと良い方法ご存じの方がいらっしゃいましたら、教えていただけると助
かります。
---ソースの抜粋----
■UserLogicImpl
instance=InstanceType.PROTOTYPE,
autoBinding=AutoBindingType.PROPERTY)
public class UserLogicImpl implements UserLogic {
public Users entity = new Users();
@RequiredTx
public void save() {
Users user = db.from(Users.class).
where("ID = ?", entity.id).getSingleResult();
if ( user == null ) {
db.insert(entity).execute();
} else {
db.update(entity).execute();
}
}
}
■Users
@Entity
public class Users {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
public int id;
public String name;
}
■CreateTable
CREATE TABLE USERS (
ID NUMBER(6,0) NOT NULL,
NAME VARCHAR2(120) NOT NULL
)
/
■CreateSequence
CREATE SEQUENCE USERS_ID
start with 1
maxvalue 999999
nocycle
cache 20
order
/
■実行部分(抜粋)
UserLogicImpl user1 = (UserLogicImpl) s2container.getComponent(UserLogic.
class);
user1.entity.name = "user1";
user1.save(); //ここはnextvalされる
UserLogicImpl user2 = (UserLogicImpl) s2container.getComponent(UserLogic.
class);
user2.entity.name = "user2";
user2.save(); //ここはnextvalされない
※diconファイルはデータベースの接続先とconventionのaddPackegeName、それ
とdialectをoracleDialectに変更していますが、その他はS2.4.19のresourceに
ある物と違いはありません
=========================================================
株式会社 ネットスクエア
佐藤 慎也 <E-mail:[E-MAIL ADDRESS DELETED]>
〒733-0822
広島市西区庚午中4丁目6−1セントラルビル3F
http://www.net-squares.com/
TEL:(082) 507 - 6266
FAX:(082) 507 - 6267
=======================================================
<< ISO文書管理は弊社のISO-SQUAREにお任せ下さい。 >>
=======================================================
Seasar-user メーリングリストの案内