zoukankan      html  css  js  c++  java
  • 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;关联配置帮助我们进行了相关数据的保存。

  • 相关阅读:
    断开Oracle连接用户
    【转】Windows英文操作系统下ArcGIS 显示和保存中文数据
    断开Oracle连接用户
    如何判断标准输入或输出是否经过了重定向,即是否在命令行上使用了“”?
    PHP MYSQL网站注入扫描
    在PHPLIB中的MYSQL类中加INSERT,UPDATE,DELETE等函数
    为Linux安置红旗紫光输出法
    Linux下Resin JSP MySQL的摆设和设置配备摆设2
    红旗Linux桌面4.1文本安顿过程图解(一)
    MYSQL数据迁移tips,ORA00907: missing right parenthesis
  • 原文地址:https://www.cnblogs.com/a1280055207/p/2869293.html
Copyright © 2011-2022 走看看