热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

Java的Hibernate框架中的组合映射学习教程

组合映射即是指主对象和子对象关联且拥有相同的生命周期的映射关系,这里我们将举一些数据操作的实例,来讲解Java的Hibernate框架中的组合映射学习教程

一、组合映射
组合是关联关系的一种特殊情况,是关联关系耦合度最高的一种关系,组合的主对象和子对象拥有相同的生命周期,主对像消亡的话子对象也会消亡。这里使用雇主和用户作为示例,用户和雇主都拥有联系方式属性,如果这里站在对象角度思考的话,常常会把对象模型绘制成为组合的方式,抽象出来一个共同的联系方式类,然后两种人分别包含相应的联系方式对象即可,向应的对象模型时它的对象示例如下图所示:

201671195324645.png (542×419)

组合对象模型在生成相应的关系模型后会把对应的子类包含到主表中,所以对应的表结构会将相应的属性生成到对应的表中,相应的表结构如下:

201671195350706.png (571×236)

1.1 Employee类及映射文件

在对象模型中Employee和Contact之间拥有包含关系,在编写代码时需要将Contact对象包含在Employee中。对应的映射文件中也需要有Contact对象的映射,需要使用标签来标明组合的对象,并把对象的属性添加到对象标签中。
清单一:Employee.java,类文件中除了基本的属性外还需要分装Contact对象,因为它们之间有一层包含关系。

package com.src.hibernate; 
 
public class Employee { 
 //id号 
 private int id; 
 public int getId() { 
  return id; 
 } 
 public void setId(int id) { 
  this.id = id; 
 } 
  
 //名称 
 private String name; 
 public String getName() { 
  return name; 
 } 
 public void setName(String name) { 
  this.name = name; 
 } 
  
 //联系对象 
 private Contact userContact; 
 public Contact getUserContact() { 
  return userContact; 
 } 
 public void setUserContact(Contact userContact) { 
  this.userCOntact= userContact; 
 } 
  
} 

清单二:Employee.hbm.xml,添加对应的映射文件,映射的组合对象要使用来标明,并在该标签中添加对应的对象属性,具体如下代码:

<&#63;xml version="1.0"&#63;> 
 
 
  
   
    
   
   
   
   
    
    
    
    
   
  
 

1.2 User类及配置文件

清单三:User.java,它的内容结构和Employee.java的相同,其它的不再多说,看代码:

package com.src.hibernate; 
 
public class User { 
 //id号 
 private int id; 
 public int getId() { 
  return id; 
 } 
 public void setId(int id) { 
  this.id = id; 
 } 
  
 //姓名 
 private String name; 
 public String getName() { 
  return name; 
 } 
 public void setName(String name) { 
  this.name = name; 
 } 
  
 //联系对象 
 private Contact userContact; 
 public Contact getUserContact() { 
  return userContact; 
 } 
 public void setUserContact(Contact userContact) { 
  this.userCOntact= userContact; 
 } 
  
} 

清单四:User.hbm.xml,它的内容结构同Employee.hbm.xml内容,主要是标签的使用,很简单,代码如下:

<&#63;xml version="1.0"&#63;> 
 
 
  
   
    
   
   
   
   
    
    
    
    
   
  
 

1.3 Contact.java类
该类文件没有什么需要注意的地方,添加基本的属性即可,也不需要为该类配置对应的映射,所以它的内容相当的简单。

package com.src.hibernate; 
 
public class Contact { 
  
 //email地址 
 private String email; 
 public String getEmail() { 
  return email; 
 } 
 public void setEmail(String email) { 
  this.email = email; 
 } 
  
 //住址 
 private String address; 
 public String getAddress() { 
  return address; 
 } 
 public void setAddress(String address) { 
  this.address = address; 
 } 
  
 //邮编号 
 private String zipCode; 
 public String getZipCode() { 
  return zipCode; 
 } 
 public void setZipCode(String zipCode) { 
  this.zipCode = zipCode; 
 } 
  
 //联系电话 
 private String contactTel; 
 public String getContactTel() { 
  return contactTel; 
 } 
 public void setContactTel(String contactTel) { 
  this.cOntactTel= contactTel; 
 } 
} 

1.4  生成结果
经过上面的文件配置后接下来就可以生成相应的数据库表结构了,生成的SQL语句如下:

drop table if exists t_employee 
drop table if exists t_user 
create table t_employee (id integer not null auto_increment, name varchar(255), email varchar(255), address varchar(255), zipCode varchar(255), contactTel varchar(255), primary key (id)) 
create table t_user (id integer not null auto_increment, name varchar(255), email varchar(255), address varchar(255), zipCode varchar(255), contactTel varchar(255), primary key (id)) 

生成的数据库表结构如下:

201671195556143.png (668×406)

二、数据操作
组合映射得到的表结构是一个完整的表,所以在写入和读取数据时采用最原始的方法就可以实现,这里还使用前几篇文章中用到的测试方法来写入和读取数据,分别是使用save和load方法,具体操作见下文。
2.1 插入数据
这里使用User作为示例,Employee的写入操作同User。在写入数据时需要创建两个对象,一个是联系对象,另外一个是用户对象,在保存时只需要保存用户对象即可,相应的联系对象会连带着保存。

public void testSave1(){ 
 //声明会话对象 
 Session session=null; 
  
 try{ 
  //获取会话对象 
  session=HibernateUtils.getSession(); 
  //开启会话 
  session.beginTransaction(); 
   
  //创建连接对象 
  Contact userCOntact=new Contact(); 
  userContact.setAddress("北京市"); 
  userContact.setContactTel("1243435"); 
  userContact.setEmail("123@gamil.com"); 
  userContact.setZipCode("zipCode"); 
   
  //创建用户对象 
  User user=new User(); 
  user.setName("zhangsan"); 
  user.setUserContact(userContact); 
   
  session.save(user); 
  //提交会话 
  session.getTransaction().commit(); 
 }catch(Exception e){ 
  e.printStackTrace(); 
  session.getTransaction().rollback(); 
 }finally{ 
  HibernateUtils.closeSession(session); 
 } 
} 

生成的SQL语句:

insert into t_user (name, email, address, zipCode, contactTel) values (&#63;, &#63;, &#63;, &#63;, &#63;) 

查看表结构如下:

201671195640625.png (668×117)

2.2读取操作

同样使用User作为示例,Employee的操作同User对象。读取操作相当的简单,代码如下:

public void testLoad1(){ 
 //声明会话对象 
 Session session=null; 
  
 try{ 
  //获取会话对象 
  session=HibernateUtils.getSession(); 
  //开启会话 
  session.beginTransaction(); 
 
  //获取user对象 
  User user=(User)session.load(User.class, 1); 
   
  System.out.println("用户姓名: "+user.getName()); 
  //提交会话 
  session.getTransaction().commit(); 
 }catch(Exception e){ 
  e.printStackTrace(); 
  session.getTransaction().rollback(); 
 }finally{ 
  HibernateUtils.closeSession(session); 
 } 
} 

生成对应的结果如下:

Hibernate: select user0_.id as id0_0_, user0_.name as name0_0_, user0_.email as email0_0_, user0_.address as address0_0_, user0_.zipCode as zipCode0_0_, user0_.contactTel as contactTel0_0_ from t_user user0_ where user0_.id=&#63; 
用户姓名: zhangsan 

三、综合实例
Account:

public class Account implements Serializable{
 private int id;
 private double money;
 private Address address;
 public int getId() {
  return id;
 }
 public void setId(int id) {
  this.id = id;
 }
 public double getMoney() {
  return money;
 }
 public void setMoney(double money) {
  this.mOney= money;
 }
 public Address getAddress() {
  return address;
 }
 public void setAddress(Address address) {
  this.address = address;
 }
 
}

Address:

public class Address implements Serializable{
  private String code;
  private String city;
  private String province;
  public String getCode() {
   return code;
  }
  public void setCode(String code) {
   this.code = code;
  }
  public String getCity() {
   return city;
  }
  public void setCity(String city) {
   this.city = city;
  }
  public String getProvince() {
   return province;
  }
  public void setProvince(String province) {
   this.province = province;
  }
  
}

Account.hbm.xml:

<&#63;xml version="1.0" encoding="utf-8"&#63;>



 
  
  
  
  
  
   
  
  
   
    
   
    
    
   
    
    
   
     
 


推荐阅读
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • Activiti7流程定义开发笔记
    本文介绍了Activiti7流程定义的开发笔记,包括流程定义的概念、使用activiti-explorer和activiti-eclipse-designer进行建模的方式,以及生成流程图的方法。还介绍了流程定义部署的概念和步骤,包括将bpmn和png文件添加部署到activiti数据库中的方法,以及使用ZIP包进行部署的方式。同时还提到了activiti.cfg.xml文件的作用。 ... [详细]
  • Hibernate延迟加载深入分析-集合属性的延迟加载策略
    本文深入分析了Hibernate延迟加载的机制,特别是集合属性的延迟加载策略。通过延迟加载,可以降低系统的内存开销,提高Hibernate的运行性能。对于集合属性,推荐使用延迟加载策略,即在系统需要使用集合属性时才从数据库装载关联的数据,避免一次加载所有集合属性导致性能下降。 ... [详细]
  • 项目运行环境配置及可行性分析
    本文介绍了项目运行环境配置的要求,包括Jdk1.8、Tomcat7.0、Mysql、HBuilderX等工具的使用。同时对项目的技术可行性、操作可行性、经济可行性、时间可行性和法律可行性进行了分析。通过对数据库的设计和功能模块的设计,确保系统的完整性和安全性。在系统登录、系统功能模块、管理员功能模块等方面进行了详细的介绍和展示。最后提供了JAVA毕设帮助、指导、源码分享和调试部署的服务。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文介绍了通过mysql命令查看mysql的安装路径的方法,提供了相应的sql语句,并希望对读者有参考价值。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • Oracle10g备份导入的方法及注意事项
    本文介绍了使用Oracle10g进行备份导入的方法及相关注意事项,同时还介绍了2019年独角兽企业重金招聘Python工程师的标准。内容包括导出exp命令、删用户、创建数据库、授权等操作,以及导入imp命令的使用。详细介绍了导入时的参数设置,如full、ignore、buffer、commit、feedback等。转载来源于https://my.oschina.net/u/1767754/blog/377593。 ... [详细]
  • ubuntu用sqoop将数据从hive导入mysql时,命令: ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 如何在php中将mysql查询结果赋值给变量
    本文介绍了在php中将mysql查询结果赋值给变量的方法,包括从mysql表中查询count(学号)并赋值给一个变量,以及如何将sql中查询单条结果赋值给php页面的一个变量。同时还讨论了php调用mysql查询结果到变量的方法,并提供了示例代码。 ... [详细]
author-avatar
他w与他说
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有