Hibernate 表关系描述之OneToOne

 在数据库领域中,数据表和数据表之间关系一般可以分为如下几种:
 单对单:比如公民和身份证的关系,一个人只有一张身份证,同时每张身份证也仅仅对应一个人!
 单对多:比如单个客户和订单之间的关系,每个客户可以同时下多张订单!
 多对多:比如学生管理系统中,学生与课程,教师与学生之间的关系!
 上面是简单的说了下数据库表与表之间的关系,那么我们现在要说的是Hibernate,来看看Hibernate中如何使用表与表的关系,首先来看看我数据库中二个示例表user和card分别表示用户和身份证!二个表中分别有二字段,创建表的DDL如下:
None.gif   create   table  `study`.`card`(
None.gif        `cardid` 
int   default   ''   not   null , -- 主键
None.gif
       `cardnum`  int ,     -- 身份证号
None.gif
         primary   key  (`cardid`)
None.gif    );
None.gif    
create   unique   index  ` PRIMARY on  `study`.`card`(`cardid`);
None.gif
None.gif        
create   table  `study`.` user `(
None.gif        `userid` 
int   not   null  auto_increment, -- 主键,自动递增
None.gif
       `username`  varchar ( 20 ), -- 用户名
None.gif
         primary   key  (`userid`)
None.gif    );
None.gif    
create   unique   index  ` PRIMARY on  `study`.` user `(`userid`);
None.gif

这二张表简单说明人与身份证的关系,熟练点的朋友可能看到我们并没有在card类中为cardid指明外键,而它的外键应该就是user表中的userID,那么这些关系在哪儿声明呢,讲到Hibernate,当然就是在Hibernate中定义了,好了,开始看看如何做:
 首先还是建立一个Project,加载Hibernate,并且由MYSQL,生成映射Bean,具体做方法参见Hibernate 初识(补充)
 ,我们看生成的Card和User类很普通,与先前我们讲到的没什么区别,但现在我们要在这二个Bean中添加属性,Card添加user属性,而User添加card属性,完整代码如下:

ContractedBlock.gif ExpandedBlockStart.gif User.java
None.gifpackage fengyan.hibernate;
None.gif
None.gif
None.gif
ExpandedBlockStart.gifContractedBlock.gif
public class User  implements java.io.Serializable dot.gif{
InBlock.gif
InBlock.gif
InBlock.gif    
// Fields    
InBlock.gif

InBlock.gif     
private Integer userid;
InBlock.gif     
private String username;
InBlock.gif
InBlock.gif     
private Card card;
InBlock.gif     
InBlock.gif
InBlock.gif    
// Constructors
InBlock.gif

ExpandedSubBlockStart.gifContractedSubBlock.gif    
public Card getCard() dot.gif{
InBlock.gif        
return card;
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
public void setCard(Card card) dot.gif{
InBlock.gif        
this.card = card;
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
/** *//** default constructor */
ExpandedSubBlockStart.gifContractedSubBlock.gif    
public User() dot.gif{
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
ExpandedSubBlockStart.gifContractedSubBlock.gif    
/** *//** full constructor */
ExpandedSubBlockStart.gifContractedSubBlock.gif    
public User(String username) dot.gif{
InBlock.gif        
this.username = username;
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif   
InBlock.gif    
// Property accessors
InBlock.gif

ExpandedSubBlockStart.gifContractedSubBlock.gif    
public Integer getUserid() dot.gif{
InBlock.gif        
return this.userid;
ExpandedSubBlockEnd.gif    }

InBlock.gif    
ExpandedSubBlockStart.gifContractedSubBlock.gif    
public void setUserid(Integer userid) dot.gif{
InBlock.gif        
this.userid = userid;
ExpandedSubBlockEnd.gif    }

InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
public String getUsername() dot.gif{
InBlock.gif        
return this.username;
ExpandedSubBlockEnd.gif    }

InBlock.gif    
ExpandedSubBlockStart.gifContractedSubBlock.gif    
public void setUsername(String username) dot.gif{
InBlock.gif        
this.username = username;
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

ContractedBlock.gif ExpandedBlockStart.gif Card.java
None.gifpackage fengyan.hibernate;
None.gif
None.gif
None.gif
ExpandedBlockStart.gifContractedBlock.gif
public class Card  implements java.io.Serializable dot.gif{
InBlock.gif
InBlock.gif
InBlock.gif    
// Fields    
InBlock.gif

InBlock.gif     
private Integer cardid;
InBlock.gif     
private Integer cardnum;
InBlock.gif     
private User user;
InBlock.gif     
InBlock.gif
InBlock.gif    
// Constructors
InBlock.gif

ExpandedSubBlockStart.gifContractedSubBlock.gif    
public User getUser() dot.gif{
InBlock.gif        
return user;
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
public void setUser(User user) dot.gif{
InBlock.gif        
this.user = user;
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
/** *//** default constructor */
ExpandedSubBlockStart.gifContractedSubBlock.gif    
public Card() dot.gif{
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
ExpandedSubBlockStart.gifContractedSubBlock.gif    
/** *//** full constructor */
ExpandedSubBlockStart.gifContractedSubBlock.gif    
public Card(Integer cardnum) dot.gif{
InBlock.gif        
this.cardnum = cardnum;
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif   
InBlock.gif    
// Property accessors
InBlock.gif

ExpandedSubBlockStart.gifContractedSubBlock.gif    
public Integer getCardid() dot.gif{
InBlock.gif        
return this.cardid;
ExpandedSubBlockEnd.gif    }

InBlock.gif    
ExpandedSubBlockStart.gifContractedSubBlock.gif    
public void setCardid(Integer cardid) dot.gif{
InBlock.gif        
this.cardid = cardid;
ExpandedSubBlockEnd.gif    }

InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
public Integer getCardnum() dot.gif{
InBlock.gif        
return this.cardnum;
ExpandedSubBlockEnd.gif    }

InBlock.gif    
ExpandedSubBlockStart.gifContractedSubBlock.gif    
public void setCardnum(Integer cardnum) dot.gif{
InBlock.gif        
this.cardnum = cardnum;
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

我们现在就可以看到这样用户中有卡,卡也对应用户,一对一!在Bean中体现,当然现在我们已经要有概念,就是仅仅在Bean中这样声明是没用的,我们需要修改类与表的映射文件
 先改User.hbm.xml:内容如下:

None.gif <? xml version="1.0" encoding="GBK" ?>
None.gif
<! DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
None.gif"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>
None.gif
<!--  
None.gif    Mapping file autogenerated by MyEclipse - Hibernate Tools
None.gif
-->
None.gif
< hibernate-mapping >
None.gif    
< class  name ="fengyan.hibernate.User"  table ="user" >
None.gif        
< id  name ="userid"  type ="java.lang.Integer" >
None.gif            
< column  name ="userid"   />
None.gif            
< generator  class ="native"   /> <!--  主键为自动递增  -->
None.gif        
</ id >
None.gif        
< property  name ="username"  type ="java.lang.String" >
None.gif            
< column  name ="username"  length ="20"   />
None.gif        
</ property >
None.gif        
None.gif        
<!--  
None.gif            我们添加一个<ont-to-one>节点 
None.gif            里面的属性card    对应的calss          
None.gif            cascade="all"一个用户对应一张卡,一张卡对应一个用户,但还是有一个主的,也就是人
None.gif            我们先出生人,然后才办卡,所以在这加入cascade由User主控                                                            
None.gif        
-->       
None.gif        
< one-to-one  name ="card"  class ="fengyan.hibernate.Card"  cascade ="all" ></ one-to-one >
None.gif    
</ class >
None.gif
</ hibernate-mapping >
None.gif

补充说明,cascade=all,说明当User删除或增加时Card也受影响!
Card.hbm.xml 内容如下:

None.gif <? xml version="1.0" encoding="GBK" ?>
None.gif
<! DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
None.gif"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>
None.gif
<!--  
None.gif    Mapping file autogenerated by MyEclipse - Hibernate Tools
None.gif
-->
None.gif
< hibernate-mapping >
None.gif    
< class  name ="fengyan.hibernate.Card"  table ="card" >
None.gif        
< id  name ="cardid"  type ="java.lang.Integer" >
None.gif            
< column  name ="cardid"   />
None.gif            
< generator  class ="foreign" > <!--  User是递增,那么卡的编号从哪来?  -->
None.gif                
< param  name ="property" > user </ param > <!-- 外键为user这个属性来确定 -->
None.gif            
</ generator >
None.gif        
</ id >
None.gif        
< property  name ="cardnum"  type ="java.lang.Integer" >
None.gif            
< column  name ="cardnum"   />
None.gif        
</ property >
None.gif        
None.gif        
< one-to-one  name ="user"  class ="fengyan.hibernate.User" ></ one-to-one >
None.gif    
</ class >
None.gif
</ hibernate-mapping >

配置完成后,我们来一编写一个DAO类userDAO.java代码如下:

None.gif package  fengyan.hibernate;
None.gif
None.gif
import  org.hibernate.Session;
None.gif
import  org.hibernate.Transaction;
None.gif
ExpandedBlockStart.gifContractedBlock.gif
public   class  UserDAO  dot.gif {
InBlock.gif
InBlock.gif    
public void save(User user)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
InBlock.gif        Session session 
= HibernateSessionFactory.getSession();
InBlock.gif        Transaction transaction 
= session.beginTransaction();
InBlock.gif        session.save(user);
InBlock.gif        transaction.commit();
InBlock.gif        session.close();
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

新建一个Servlet处理代码如下:

None.gif      public   void  doPost(HttpServletRequest request, HttpServletResponse response)
ExpandedBlockStart.gifContractedBlock.gif            
throws  ServletException, IOException  dot.gif {
InBlock.gif
InBlock.gif        User user 
= new User();
InBlock.gif        user.setUsername(
"fengyan");//设置用户名
InBlock.gif
        Card card = new Card();
InBlock.gif        card.setCardnum(
420983);//设置身份证号
InBlock.gif
        user.setCard(card);
InBlock.gif        card.setUser(user);
InBlock.gif        UserDAO ua 
= new UserDAO();
InBlock.gif        ua.save(user);
//这样在添加用户的时候会自动添加一张卡
ExpandedBlockEnd.gif
    }

最后JSP代码:

None.gif    < body >
None.gif    This is my JSP page. 
< br >
None.gif    
< href ="servlet/addUser" > add user </ a >
None.gif  
</ body >

当我们运行的时候,会发现User表中新增了一条记录

同时Card表中也新增了一条记录,但我们在doPost()方法中仅仅是save(user),而并没有save(card),为什么card也会添加进去,这就是我们在配置文件中写的表关系作用!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值