好好学习,天天向上!

Hibernate的级联配置

原文地址:Hibernate的级联配置作者:fe人偶尊

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;关联配置帮助我们进行了相关数据的保存。

posted @ 2013-01-21 10:23  忍性而为  阅读(329)  评论(0编辑  收藏  举报
好好学习,天天向上!