- PR -

Struts+Hibernate+Spring2.0について

1
投稿者投稿内容
HSIN YI
会議室デビュー日: 2007/11/19
投稿数: 4
お住まい・勤務地: 神戸
投稿日時: 2007-12-04 12:04
こんにちは。Spring2.0の初心者です。
現在Struts+Hibernate+Spring2.0でWebアプリを作っています。
StrutsからHibernateの検索、更新、検索をするSQL文が
Junitでテストする時とWebアプリで動かした時が違います。
使用したDBはDB2です。
呼び出したTBLはEmployeeとSkillです。
EmployeeとSkillが関連付けされています。
Employeeの中にSet型のSkillsのインスタンスがあります。
EmployeeのSkillsをorder-by="SKILL_ID"に設定しています。
Skillsの順番はSkill_Id順で並びます。

Skillの中にSet型employeesのインスタンスがあります。
二つのテーブルはSkill_Mapで関連付けされています。


(employeeService、検索するDAO、トランザクションがすべてDIで管理されている。DBアクセス、検索、更新はHibernateTemplateで行う)
@Webアプリのコードは↓Struts:UpdateSkillAction.java

//employeeID:2のemployeeを取得する
Employee employee = employeeService.getEmployee(new Integer(2));
//employeeから該当のSkillsを取り出す
Set Skills = employee.getSkills();

....いろいろ中略....Skillsに新しいSkillを追加する。

Skills.add(skill);
//employeeに追加したSkillsにセットし直す
employee.setSkills(Skills);
//employeeを更新する
employeeService.updateEmployee(employee);
System.out.println("update.skill:"+employeeService.getEmployee(new Integer(2)).getSkills());

AJunitでのコード
EmployeeService employeeService = (EmployeeService) factory.getBean("employeeService");
Employee employee = employeeService.getEmployee(new Integer(2));
Set Skills=(Set) employee.getSkills();

....いろいろ中略...Skillsに新しいSkillを追加する。

Skills.add(skill);
employee.setSkills(empSkills);
employeeService.updateEmployee(employee);
System.out.println("update.skill:"+employeeService.getEmployee(new Integer(2)).getSkills());

System.out.println("update.skill:"+employeeService.getEmployee(new Integer(2)).getSkills());
↑Junitで実行するときに、コンソールで見たログは
update文の後もう一度EmployeeとSkill二つのTBLを検索し直している。
でも、Webアプリで実行する時
update文の後のselect文はSkillテーブルのみ、Selectするだけです。
そのため、取ってきたSkillsの順番が異なる。
Junitで取ってきたSkillsは内容がSkill_Id順ですが、Webアプリで取ってきたSkillsは追加するSkill順になっています。
EX:employeeId:2のemployeeのスキルは「スキルA」「スキルE]です。
新たに、「スキルB]を追加する。
@Webアプリで実行した時のコンソール
old.empskill:[[id:1 name:スキルA description:スキル備考A versionstamp:0], [id:5 name:スキルE description:スキル備考E versionstamp:0]]
Hibernate: update EMPLOYEE set VERSION_STAMP=?, EMPLOYEE_NAME=?, SEX=?, JOB=?, TEL=?, MAIL=?, DESCRIPTION=?, DEPARTMENT_ID=? where EMPLOYEE_ID=? and VERSION_STAMP=?
Hibernate: insert into SKILL_MAP (EMPLOYEE_ID, SKILL_ID) values (?, ?)
Hibernate: select employee0_.EMPLOYEE_ID as EMPLOYEE1_1_, employee0_.VERSION_STAMP as VERSION2_1_, employee0_.EMPLOYEE_NAME as EMPLOYEE3_1_, employee0_.SEX as SEX1_, employee0_.JOB as JOB1_, employee0_.TEL as TEL1_, employee0_.MAIL as MAIL1_, employee0_.DESCRIPTION as DESCRIPT8_1_, employee0_.DEPARTMENT_ID as DEPARTMENT9_1_ from EMPLOYEE employee0_ where employee0_.EMPLOYEE_ID=?
update.skills:[[id:1 name:スキルA description:スキル備考A versionstamp:0], [id:5 name:スキルE description:スキル備考E versionstamp:0], [id:2 name:スキルB description:スキル備考B versionstamp:0]]
Hibernate: select employee0_.EMPLOYEE_ID as EMPLOYEE1_1_, employee0_.VERSION_STAMP as VERSION2_1_, employee0_.EMPLOYEE_NAME as EMPLOYEE3_1_, employee0_.SEX as SEX1_, employee0_.JOB as JOB1_, employee0_.TEL as TEL1_, employee0_.MAIL as MAIL1_, employee0_.DESCRIPTION as DESCRIPT8_1_, employee0_.DEPARTMENT_ID as DEPARTMENT9_1_ from EMPLOYEE employee0_ where employee0_.EMPLOYEE_ID=?
update.skill:[[id:1 name:スキルA description:スキル備考A versionstamp:0], [id:5 name:スキルE description:スキル備考E versionstamp:0], [id:2 name:スキルB description:スキル備考B versionstamp:0]]

AJunitで実行した時のコンソール
old.empskill:[[id:1 name:スキルA description:スキル備考A versionstamp:0], [id:5 name:スキルE description:スキル備考E versionstamp:0]]
Hibernate: update EMPLOYEE set VERSION_STAMP=?, EMPLOYEE_NAME=?, SEX=?, JOB=?, TEL=?, MAIL=?, DESCRIPTION=?, DEPARTMENT_ID=? where EMPLOYEE_ID=? and VERSION_STAMP=?
Hibernate: insert into SKILL_MAP (EMPLOYEE_ID, SKILL_ID) values (?, ?)
Hibernate: select employee0_.EMPLOYEE_ID as EMPLOYEE1_1_, employee0_.VERSION_STAMP as VERSION2_1_, employee0_.EMPLOYEE_NAME as EMPLOYEE3_1_, employee0_.SEX as SEX1_, employee0_.JOB as JOB1_, employee0_.TEL as TEL1_, employee0_.MAIL as MAIL1_, employee0_.DESCRIPTION as DESCRIPT8_1_, employee0_.DEPARTMENT_ID as DEPARTMENT9_1_ from EMPLOYEE employee0_ where employee0_.EMPLOYEE_ID=?
Hibernate: select department0_.DEPARTMENT_ID as DEPARTMENT1_0_0_, department0_.VERSION_STAMP as VERSION2_0_0_, department0_.DEPARTMENT_NAME as DEPARTMENT3_0_0_, department0_.DESCRIPTION as DESCRIPT4_0_0_ from DEPARTMENT department0_ where department0_.DEPARTMENT_ID=?
Hibernate: select employees0_.DEPARTMENT_ID as DEPARTMENT9_1_, employees0_.EMPLOYEE_ID as EMPLOYEE1_1_,

:中略

update.skill:[[id:1 name:スキルA description:スキル備考A versionstamp:0], [id:2 name:スキルB description:スキル備考B versionstamp:0], [id:5 name:スキルE description:スキル備考E versionstamp:0]]

同じの構文でSQL文が異なる原因が分からないです。とても困ります。
ご存知な方、是非教えていただきたいのです。
ありがとうございます。
1

スキルアップ/キャリアアップ(JOB@IT)