Hiberante的集合映射可以很方便的将两个表关联起来,并且进行存储和查询操作。
入门示例如下:
首先要有三张表,artist(乐手表)、music(歌曲表)、artist_music(乐手-歌手表)。
我用的是SQL SERVER数据库,建表语句如下:
create table artist
(
artistid int identity(1,1) primary key,
artistname varchar(50)
)
create table music
(
musicid int identity(1,1) primary key,
musicname varchar(50)
)
另外的artist_music表则是包含两个字段,一个为artistid,另一个为musicid。
接下来,就可以创建artist和music对应的class文件。由于乐手与他演唱过的歌曲相对应,故artist中有music的一个集合(Set)。
如下:
package com.learn.hibernate.model;
import java.util.HashSet;
import java.util.Set;
public class Artist {
private int artistid;
private String artistname;
private Set music=new HashSet(0);
public Integer getArtistid()
{
return this.artistid;
}
public void setArtistid(Integer id)
{
this.artistid=id;
}
public void setArtistname(String name)
{
this.artistname=name;
}
public String getArtistname()
{
return this.artistname;
}
public void setMusic(Set music)
{
this.music=music;
}
public Set getMusic()
{
return this.music;
}
}
package com.learn.hibernate.model;
import java.util.HashSet;
import java.util.Set;
public class Music {
private int musicid;
private String musicname;
private Set artist=new HashSet(0);
public Integer getMusicid()
{
return this.musicid;
}
public void setMusicid(Integer id)
{
this.musicid=id;
}
public String getMusicname()
{
return this.musicname;
}
public void setMusicname(String musicname)
{
this.musicname=musicname;
}
public void setArtist(Set artist)
{
this.artist=artist;
}
public Set getArtist()
{
return this.artist;
}
}
再就是配置**.hbm.xml文件,其中artist.hbm.xml中要包含对music set的配置。
artist.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 package="org.hibernate.tutorial.domain">
<class name="com.learn.hibernate.model.Artist" table="artist">
<meta attribute="sync-DAO">false</meta>
<id name="artistid" type="int">
<generator class="identity"/>
</id>
<property name="artistname"/>
<set name="music" table="artist_music">
<key column="artistid"/>
<many-to-many class="com.learn.hibernate.model.Music" column="musicid"></many-to-many>
</set>
</class>
</hibernate-mapping>
music.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 package="org.hibernate.tutorial.domain">
<class name="com.learn.hibernate.model.Music" table="music">
<meta attribute="sync-DAO">false</meta>
<id name="musicid" type="int">
<generator class="identity"/>
</id>
<property name="musicname"/>
</class>
</hibernate-mapping>
接下来,就可以写测试文件了。(记得先在hibernate.cfg.xml中写上mapping的配置!)
import org.hibernate.*;
import com.learn.hibernate.model.Artist;
import com.learn.hibernate.model.Music;
import java.util.*;
public class SetTest {
//为歌手和歌手的曲目进行存储
public void saveInfo()
{
Set music=new HashSet(0);
Music music1=new Music();
music1.setMusicname("十七岁");
Music music2=new Music();
music2.setMusicname("冰雨");
Music music3=new Music();
music3.setMusicname("牧笛");
music.add(music1);
music.add(music2);
music.add(music3);
Artist artist=new Artist();
artist.setArtistname("刘德华");
artist.setMusic(music);
SessionFactory sessionFactory=SessionFactoryUtil.getSessionFactory();
Session session=sessionFactory.openSession();
Transaction tran=session.beginTransaction();
session.save(music1);
session.save(music2);
session.save(music3);
session.save(artist);
tran.commit();
session.close();
sessionFactory.close();
System.out.println("保存数据成功!");
}
public static void main(String[] args)
{
SetTest setTest=new SetTest();
setTest.saveInfo();
}
}
运行之后,三张表中就插入了对应的数据。非常的简便。
另外一个,对存储好了的数据进行查询。也是非常方便的:
import org.hibernate.*;
import com.learn.hibernate.model.Artist;
import com.learn.hibernate.model.Music;
import java.util.*;
public class SetTest {
//对集合映射进行查询
public void queryMusic(String artistname)
{
SessionFactory sessionFactory=SessionFactoryUtil.buildSessionFactory();
Session session=sessionFactory.openSession();
Query query=session.createQuery("from Artist where artistname=:artistname");
query.setString("artistname",artistname);
List<Artist> list=query.list();
if(list.size()>0)
{
Artist artist=list.get(0);
System.out.println(artist.getArtistname()+"唱过的歌为:");
Set music=artist.getMusic();
Iterator itar=music.iterator();
while(itar.hasNext())
{
Music music_tmp=(Music) itar.next();
System.out.println(music_tmp.getMusicname());
}
}
}
public static void main(String[] args)
{
SetTest setTest=new SetTest();
setTest.queryMusic("刘德华");
}
}