Hibernate - 複数テーブルのマッピング(1対多)Advertisementone-to-meny
1対多のマッピングを行うときは、多のほうのオブジェクトをコレクション経由で取得する。
サンプルテーブル以下の2つのテーブルを利用する。MEMBER表(多)
SKILL表(1)
DTO(永続化クラス)SkillDto.java
package dto;
import java.util.Set;
public class SkillDto {
private Integer id;
private String text;
private Set member;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public Set getMember(){
return member;
}
public void setMember(Set member){
this.member = member;
}
}
MemberDto.java
package dto;
public class MemberDto{
private Integer id;
private String name;
private Integer skillId;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getSkillId() {
return skillId;
}
public void setSkillId(Integer skillId) {
this.skillId = skillId;
}
}
Skill表にはSetクラス(コレクション)のフィールドが定義されている。
マッピング情報skill.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="dto.SkillDto" table="skill">
<id name="id" column="id">
<generator class="assigned" />
</id>
<property name="text" type="java.lang.String" column="text"/>
<set name="member" >
<key><column name="skillId" /></key>
<one-to-many class="dto.MemberDto" />
</set>
</class>
</hibernate-mapping>
member.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="dto.MemberDto" table="MEMBER">
<id name="id" column="id" type="java.lang.Integer" >
<generator class="assigned" />
</id>
<property name="name" type="string" column="NAME" />
<property name="skillId" type="java.lang.Integer" column="skillid" />
</class>
</hibernate-mapping>
クライアントOneToMeny.java
package client;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import dto.MemberDto;
import dto.SkillDto;
public class OneToMeny{
public static void main(String args[]) throws Exception{
Configuration config = new Configuration().configure();
SessionFactory sessionfactory = config.buildSessionFactory();
Session session = sessionfactory.openSession();
List list = session.createCriteria(SkillDto.class).list();
for(int i = 0; i < list.size(); i++){
SkillDto skill = (SkillDto)list.get(i);
System.out.println(skill.getText());
Iterator memberList = skill.getMember().iterator();
while(memberList.hasNext()) {
MemberDto member = (MemberDto)memberList.next();
System.out.println("\t" + member.getName());
}
}
}
}
はじめにSkillDtoをHibernate経由で取得する。SkillDtoはID列に対応するMemberDtoのオブジェクトを複数保持しているので、コレクション経由で取り出すことができる。実行結果
java
鬼太郎
親父
.NET
ねずみ男
PHP
Advertisement |
ショートカット・634・634ブログ ・このカテゴリのトップページに戻る ・Incubator(Pukiwiki) ・634ラボ UIコレクションギャラリー ZO-3ジェネレーター サイト検索Y!ログール |