Hibernate - 複数テーブルのマッピング(1対多)

Advertisement

one-to-meny

1対多のマッピングを行うときは、多のほうのオブジェクトをコレクション経由で取得する。

サンプル

テーブル

以下の2つのテーブルを利用する。

MEMBER表(多)
IDNAMESKILLID
00鬼太郎00
01親父00
02ねずみ男02

SKILL表(1)
IDTEXT
00Java
01.NET
02PHP
MEMBER表のSKILLID列は、SKILL表IDの外部キー(Foreign Key)になっている。

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ラボ

サイト検索

Google

Web サイト内

Y!ログール