博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多対一关联映射
阅读量:5902 次
发布时间:2019-06-19

本文共 2571 字,大约阅读时间需要 8 分钟。

     
多対一恐怕是现实世界中存在的最普遍的一种关联关系了。
     hibernate在解决多対一关联映射时提出了一种普遍的思想:在实体模型中通过“多”持有“一”的引用来反映这种关系,在关系模型中通过在“多”的一端增加个外加指向“一”的一端。其实,这种思想还常常用来解决一对一和多对多。
      看看我们的User和Group的实例是怎么实现的吧:
 
1.实体模型:
 
2.关系模型:
 
3.实体类:
  Group.java
public 
class Group { 

  
private 
int id; 

  
private String name; 

  
//一系列的setter.getter方法 

  @Override 

  
public String toString() { 

    
return 
"Group:"+name; 

  } 

}
 
   
User.java
public 
class User { 

  
private 
int id; 

  
private String name; 


  
private Group group; 

  
//一系列的setter.getter方法 

  @Override 

  
public String toString() { 

    
return 
"User:"+name; 

  } 

}
 
4.映射文件:
  Group.hbm.xml
  
<
class 
name
="com.sxt.hibernate.many2one.entity.Group" 
table
="sxt_hibernate_group"
> 

    
<
id 
name
="id" 
length
="4"
> 

      
<
generator 
class
="native"
>
</
generator
> 

    
</
id
> 

    
<
property 
name
="name" 
length
="10"
>
</
property
> 

  
</
class
>
 
  
  User.hbm.xml
  
<
class 
name
="com.sxt.hibernate.many2one.entity.User" 
table
="sxt_hibernate_user"
> 

    
<
id 
name
="id" 
length
="4"
> 

      
<
generator 
class
="native"
>
</
generator
> 

    
</
id
> 

    
<
property 
name
="name" 
length
="10"
>
</
property
> 

    <!--
many-to-one含义,会在多的一端加入一个外键指向一的一端,以供加载时使用.外键由column属性指定,默认和实体属性名相同. 
            cascade操作本对象时级联操作它的关联对象     
--> 

    
<
many-to-one 
name
="group" 
column
="group_id" 
cascade
="save-update"
>
</
many-to-one
> 

  
</
class
>
 
5.hibernate配置文件:
  参照前面的。
 
6.测试方法:
  
public 
static 
void main(String[] args) { 

    Session session = HibernateUtils.getSession(); 

    Transaction t = session.beginTransaction(); 

    
try { 

      
/** 
        * 测试插入数据 
        */
 

/*         Group group = new Group();//情况1.生成一个新的组 g.setName("开发组"); 
        group.setName("研发组"); 
         
        User user1=new User(); 
        user1.setName("奇隆"); 
        user1.setGroup(group); 
         
        User user2=new User(); 
        user2.setName("有朋"); 
        user2.setGroup(group); 
         
        //这里也要保证在save(user)前,它所关联的group要先save或者在User的映射文件中配置上cascade级联save,. 
        session.save(user1); 
        session.save(user2);*/
 

        

/*        Group group=(Group)session.get(Group.class, 2);//情况2.加载数据库中已经存在的组 
         
        User user=new User();     
        user.setName("谢霆锋"); 
        user.setGroup(group); 
        //由于加载的group 已经是持久化的了,所以这样也能保存成功. 
        session.save(user);*/
 

        
/** 
         * 小结:保存user之前要保证它所引用对象已经是持久化的,这样在保存user时,hibernate会自动把user的外键指向group的id 
         */
 


      User user = (User) session.get(User.
class, 3);
// 只是加载了user对象和它所在组的对象group的id属性,并没有加载group对象 

      System.out.println(user); 

      System.out.println(user.getGroup()); 

      
/** 
        * 小结:可见,在"多"的一端(user)可以加载"一"的一端(group).当然,这里存在延迟加载策略,有时间专门讨论. 
        */
 

      session.save(user);
//由于user已经是持久化的对象,并且没有做出修改,所以这里并不触发任何的sql操作    

         

      user.setName(
"郑伊健"); 

      session.save(user);
//由于user已经做了改动,所以这里会触发update操作. 

        

      t.commit(); 

    } 
catch (HibernateException e) { 

      e.printStackTrace(); 

      t.rollback(); 

    } 
finally { 

      HibernateUtils.closeSession(session); 

    } 

  } 

}
     本文转自NightWolves 51CTO博客,原文链接:
http://blog.51cto.com/yangfei520/274832
,如需转载请自行联系原作者
你可能感兴趣的文章
AE要素选择(点选和拉框选择)
查看>>
AJAX-初学AJAX本地环境配置
查看>>
Java内存模型深度解析:顺序一致性--转
查看>>
VSCode调试配置
查看>>
前端MVC学习总结(三)——AngularJS服务、路由、内置API、jQueryLite
查看>>
Selenium Web 自动化 - 项目持续集成(进阶)
查看>>
java&javaweb学习笔记
查看>>
UML统一建模语UML2和EnterpriseArchitect
查看>>
C#编程(二十二)----------继承的类型
查看>>
【精选】Nginx负载均衡学习笔记(一)实现HTTP负载均衡和TCP负载均衡(官方和OpenResty两种负载配置)...
查看>>
在 Visual Studio 2017 中找回消失的“在浏览器中查看”命令
查看>>
ajaxupload 异步上传工具
查看>>
微软面试题: 找出二叉树上任意两个结点的最近共同父结点。
查看>>
机器学习 - pycharm, tensorflow集成篇
查看>>
vue - 官方 - 上手
查看>>
Springboot 之 引入Thymeleaf
查看>>
Java基础-位运算符Bitwise Operators
查看>>
swift where 的作用
查看>>
IOS开发-使用Storyboard进行界面跳转及传值
查看>>
Linux常用基本命令( rmdir, rm, mv )
查看>>