[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 メーリングリストの案内