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

Advertisement

meny-to-one

多対1のマッピングを行うときは、多の永続化クラスに1の永続化クラスを保持させる。

サンプル

テーブル

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

SKILL表(1)
IDNAME
00Java
01.NET
02PHP

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

DTO(永続化クラス)

SkillDto.java
package dto;

public class SkillDto {
    private Integer id;
    private String text;

    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;
    }
}

MemberDto.java
package dto;

public class MemberDto{
    private Integer id;
    private String name;
    private Integer skillId;
    private SkillDto skillDto;

    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;
    }
    public SkillDto getSkillDto() {
        return skillDto;
    }
    public void setSkillDto(SkillDto skillDto) {
        this.skillDto = skillDto;
    }
}

マッピング情報

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"/>
    </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" />
    <many-to-one name ="skillDto" column="skillID"
        class="dto.SkillDto" cascade="all" outer-join="auto"
        update="false" insert="false" />
    </class>
</hibernate-mapping>

クライアント

MenyToOne.java
package client;

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 MenyToOne{
    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(MemberDto.class).list();
        for(int i = 0; i < list.size(); i++){
            MemberDto member = (MemberDto)list.get(i);
            System.out.print(member.getName());

            SkillDto skillDto = member.getSkillDto();
            System.out.println("\t" + skillDto.getName());
        }
    }
}
はじめにMemberDtoをHibernate経由で取得する。そのMemberオブジェクトは対応するSkillを保持している。

実行結果
鬼太郎    Java
親父    Java
ねずみ男    .NET

Advertisement

ショートカット

634トップページ
このカテゴリのトップページに戻る
634ラボ

サイト検索

Google

Web サイト内

Y!ログール