`
Aubergine_kang
  • 浏览: 260940 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

学习脚步----hibernate编程中的映射关系简单片面分析一下(自己学习)

阅读更多
注:在hibernate编程中的映射关系中用的最多的就是一对多多对一,下面通过一个小案例分析(cascade的使用和效果)来对最简单的进行阐述:(个人学习笔记)[size=x-small]三个类:
Cateory :
package entity;
public class Category {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Topic:
package entity;
public class Topic {
private int id;
private String name;
private Category cate;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Category getCate() {
return cate;
}
public void setCate(Category cate) {
this.cate = cate;
}

}
Msg:
package entity;
public class Msg {
private int id;
private String name;
private Topic to;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Topic getTo() {
return to;
}
public void setTo(Topic to) {
this.to = to;
}

}
三个配置文件:
Category.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="entity">
    <class name="Category" table="cate">
       <id name="id" column="cid">
          <generator class="native" />
       </id>
       <property name="name"
                 column="cname"
                 not-null="true" />        
    </class>
</hibernate-mapping>
Topic.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="entity">
    <class name="Topic" table="topic">
       <id name="id" column="tid">
          <generator class="native" />
       </id>
       <property name="name"
                 column="tname"
                 not-null="true" />   
        <many-to-one name="cate" column="cate"></many-to-one>    
    </class>
</hibernate-mapping>
Msg.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="entity">
    <class name="Msg" table="msg">
       <id name="id" column="mid">
          <generator class="native" />
       </id>
       <property name="name"
                 column="mname"
                 not-null="true" />      
       <many-to-one  name="to" column="topic"></many-to-one> 
    </class>
</hibernate-mapping>
Cateory——> Topic——>Msg
1. 删除msg中的一条记录级联删除msg所对应的topic;
假设要删除的msg所对应的topic的id是1,写如下代码:
session.beginTransaction();
Msg msg=(Msg)session.get(Msg.class, 1);
session.delete(msg);
session.getTransaction().commit();
配置文件不做任何修改,那么删除的只是msg中的记录,topic中的记录依然存在。
如果在Msg.hbm.xml配置文件中修改为<many-to-one  cascade=”all”  name="to" column="topic"></many-to-one>,那么在运行上面代码的时候就分为两种情况了:1>如果msg表中topic为1的仅有要删除的那条msg是,那么结果就是:msg中的该条记录删除,topic表中topic的id为1的记录删除;2>如果如果msg表中topic为1的除了要删除的那条msg是还有别的msg使用的topic的id也是1,那么运行上面的代码的时候就会报错,原因是msg中外键字段在使用这id为1的topic记录。
删除msg中的一条记录级联删除msg所对应的topic的id所对应的所有的msg;
将Topic类修改为:
package entity;
import java.util.*;
public class Topic {
private int id;
private String name;
private Category cate;
private Set<Msg> msgs=new HashSet<Msg>();
public Set<Msg> getMsgs() {
return msgs;
}
public void setMsgs(Set<Msg> msgs) {
this.msgs = msgs;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Category getCate() {
return cate;
}
public void setCate(Category cate) {
this.cate = cate;
}

}
将Topic.hbm.xml修改为:
<class name="Topic" table="topic">
       <id name="id" column="tid">
          <generator class="native" />
       </id>
       <property name="name"
                 column="tname"
                 not-null="true" />   
        <many-to-one name="cate" column="cate"></many-to-one>    
        <set name="msgs">
        <key column="fk"/>
        <one-to-many class="entity.Msg"/>
        </set>
</class>
则在运行:(Msg.hbm.xml中设置了cascade=“all”)
session.beginTransaction();
Msg msg=(Msg)session.get(Msg.class, 1);
session.delete(msg);
session.getTransaction().commit();
这段代码的时候结果是:msg表中的那条记录没有了,topic表中id为1的记录没有了,msg中其他使用topic的id为1的做外键的,外键字段全部变为NULL。
如果将Topic.hbm.xml修改为:
<class name="Topic" table="topic">
       <id name="id" column="tid">
          <generator class="native" />
       </id>
       <property name="name"
                 column="tname"
                 not-null="true" />   
        <many-to-one name="cate" column="cate"></many-to-one>    
        <set cascade="all" name="msgs">
        <key column="fk"/>
        <one-to-many class="entity.Msg"/>
        </set>
</class>
运行上面的结果是:msg表中的那条记录没有了,topic表中id为1的记录没有了,msg中其他使用topic的id为1的做外键的记录也全部删除了。
[b]案例总结:
开始的时候Topic和Msg是单向的多对一的外键关联:Msg中有Topic的对象做属性,Msg.hbm.xml中进行了<many-to-one  cascade=”all” name=”topic” column=”fk”/>的配置,而另一方不进行任何的特殊配置。
配置了<many-to-one>就相当于是设置了从Msg到Topic的导航,Cascade=”all”的意思是:在对我Msg表做插入、删除、更新的时候,通过导航跟我关联的Topic也进行相应的操作。
后来,在Topic类中添加了Msg的set集合,并且在Topic的配置文件中添加了<set cascade="all" name="msgs"><key column="fk"/> <one-to-many class="entity.Msg"/></set>,那么就从设置了从Topic到Msg的导航。cascade="all"的意思是在对我Topic表进行插入、删除、更新操作的时候,通过导航跟我关联的Msg也进行相应的操作。
[/b][/size]
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics