Hibernate的级联配置
Hibernate在进行表的关联配置时,可以配置持久化的关联,比如在上传歌曲时增加歌曲信息,并同时增加一条歌曲分类如何做呢?首先看一下两张表
hibernate配置可以配置成如下:
首先是歌曲类型表:
<hibernate-mapping>
<class name="com.steven.hibernatet.entity.SongType" table="songtype">
<id name="id" type="java.lang.Integer">
<column name="id"/>
<generator class="identity"></generator>
</id>
<property name="name" type="java.lang.String">
<column name="name" length="50"/>
</property>
</class>
</hibernate-mapping>
然后是歌曲表:
<hibernate-mapping>
<class name="com.steven.hibernatet.entity.Song" table="song">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="identity"></generator>
</id>
<!-- 关联配置,歌曲属于那个类别;cascade属性配置级联,级联为全部操作 -->
<many-to-one name="type" class="com.steven.hibernatet.entity.SongType"
cascade="all">
<column name="typeid" not-null="true"></column>
</many-to-one>
<property name="icon" type="java.lang.String">
<column name="icon" length="50" />
</property>
<property name="filepath" type="java.lang.String">
<column name="filepath" length="50" />
</property>
<property name="lyric" type="java.lang.String">
<column name="lyric" length="1000" />
</property>
<property name="name" type="java.lang.String">
<column name="name" length="50" />
</property>
</class>
</hibernate-mapping>
看插入代码:
// 创建一个歌曲类别
SongType type = new SongType();
type.setName("抒情");
// 创建歌曲
Song song = new Song();
song.setName("恋上一个人");
song.setFilepath("c:/music/lsygr.mp3");
song.setIcon("c:/images/1.png");
song.setLyric("歌词略");
song.setType(type);// 把歌曲类型放入歌曲
session.save(song);
这里我只写了一个保存歌曲的save,保存看一下控制台:
Hibernate: insert into songtype (name) values (?)
Hibernate: insert into song (typeid, icon, filepath, lyric, name) values (?, ?, ?, ?, ?)
看到控制台打印了两个sql语句,这里就是cascade关联配置帮助我们解决了问题。
我们还可以用另外一种做法,就是在配置的时候让歌曲类别(SongType)采取主动,当保存SongType时自动保存Song,那这里如何做呢?考虑到一个歌曲类别下面有很多歌曲(一对多关联),首先先更改一下配置如下
歌曲类型表:
<hibernate-mapping>
<class name="com.steven.hibernatet.entity.SongType" table="songtype">
<id name="id" type="java.lang.Integer">
<column name="id"/>
<generator class="identity"></generator>
</id>
<property name="name" type="java.lang.String">
<column name="name" length="50"/>
</property>
<!--配置一对多关联-->
<set name="song" table="song" cascade="all">
<key>
<column name="id" not-null="true"></column>
</key>
<one-to-many class="com.steven.hibernatet.entity.Song"/>
</set>
</class>
</hibernate-mapping>
歌曲表变成了普通的配置:
<hibernate-mapping>
<class name="com.steven.hibernatet.entity.Song" table="song">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="identity"></generator>
</id>
<many-to-one name="type" class="com.steven.hibernatet.entity.SongType">
<column name="typeid" not-null="true"></column>
</many-to-one>
<property name="icon" type="java.lang.String">
<column name="icon" length="50" />
</property>
<property name="filepath" type="java.lang.String">
<column name="filepath" length="50" />
</property>
<property name="lyric" type="java.lang.String">
<column name="lyric" length="1000" />
</property>
<property name="name" type="java.lang.String">
<column name="name" length="50" />
</property>
</class>
</hibernate-mapping>
看测试代码:
// 创建一个歌曲类别
SongType songType = new SongType();
songType.setName("摇滚");
// 创建歌曲
Song song = new Song();
song.setName("有多少爱可以重来");
song.setFilepath("c:/music/ydsakycl.mp3");
song.setIcon("c:/images/2.png");
song.setLyric("歌词略");
song.setType(songType);
songType.getSong().add(song);//将第一首歌放入此类型中
song = new Song();
song.setName("王子的新衣");
song.setFilepath("c:/music/wzdxy.mp3");
song.setIcon("c:/images/3.png");
song.setLyric("歌词略");
song.setType(songType);
songType.getSong().add(song);//将第二首歌放入此类型中
session.save(songType);//保存类型
看控制台打印:
Hibernate: insert into songtype (name) values (?)
Hibernate: insert into song (typeid, icon, filepath, lyric, name) values (?, ?, ?, ?, ?)
Hibernate: insert into song (typeid, icon, filepath, lyric, name) values (?, ?, ?, ?, ?)
Hibernate: update song set typeid=? where id=?
Hibernate: update song set typeid=? where id=?
只调用了一次保存操作,但是执行了5条sql;关联配置帮助我们进行了相关数据的保存。