`

十 组件关联

 
阅读更多
组件关联 
什么是组件关联呢?比如说一个用户,它的名称,有一个中文名,一个英文名 它有两个名称,相对于名称与用户来说
这是什么关系呢,一个用户多个名称 当然 是一对多的关系了,我们设计名称这个属性的时候,这时我们可以把名称设计为
一个实体类 Name 那么这个实体类就相对于用户名称来说,这个实体类就是组件了,那么用户名称与用户的关系,我们就称作
组件关联关系

平常我们设计关联的时候,比如说员工与部门,都是两张表的,一张员工表,一张部门表,当前我们不想把这个用户名称
与用户设计为两张表,怎么办呢?可以这样来做,可以把用户名称看成是一个组件,并且是作为用户的一个实体属性
现在就得设计两个s实体了,一个用户名称实体 这个用户名称实体存在两个属性 一个英文名 一个中文名 用户实体就是
一个用户id 用户名称(用户名称实体) 生日  我们不想把用户名称和用户设计为两张表,这时我们只需要在用户的映射文件
中引入组件这个节点 看component class是指定实体类 
<component name=”name” class=”com.test.hibernate.domain.Name”>
		<property name=”yingwenname”/>
		<property name=”zhongwenname”/>
</component>

下面我们来看一个完整的例子

用户名称实体

package dao.service;

public class Name {
   private String firstName;
   private String lastName;
public String getFirstName() {
	return firstName;
}
public void setFirstName(String firstName) {
	this.firstName = firstName;
}
public String getLastName() {
	return lastName;
}
public void setLastName(String lastName) {
	this.lastName = lastName;
}
}

用户实体 User
package dao.service;

import java.util.Date;

public class User {
   private int id;
   private Name name;
   private Date birthday;
public int getId() {
	return id;
}
public void setId(int id) {
	this.id = id;
}
public Name getName() {
	return name;
}
public void setName(Name name) {
	this.name = name;
}
public Date getBirthday() {
	return birthday;
}
public void setBirthday(Date birthday) {
	this.birthday = birthday;
}
}


映射文件
<?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="dao.service">
	<class name="User">	
	
		<id name="id">
		 
			<generator class="native"/>
		</id>
		<!--  <property name="name"/> -->
		<component name="name">
		<property name="firstName" column="frist_name"/>
		<property name="lastName" column="last_name"/>
		</component>
		<property name="birthday"/>	
	</class>
	
</hibernate-mapping>


测试类 
package dao.test;

import java.util.Date;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Restrictions;

import dao.service.Name;
import dao.service.User;
import dao.util.HibernateUtil;

public class Base {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//对hibernate进行初始化操作
//		Configuration ctf=new Configuration();
//        ctf.configure();
//        //获取连接工厂
//        SessionFactory sf=ctf.buildSessionFactory();
//        //获取连接对象
//        Session s=sf.openSession();
//        Transaction tx=s.beginTransaction();
        User user=new User();
        user.setBirthday(new Date());
        Name n=new Name();
        n.setFirstName("firstName");
        n.setLastName("lastName");
        user.setName(n);
        addUser2(user);
       // System.out.println(user.getId());
       // getUser(user.getId());
      //  System.out.println(user.getName());
        
       query(user.getName().getFirstName());
        System.out.println(user.getBirthday());
        System.out.print("end");
	}
   static void addUser1(User user)
   {
	      Session s=null;
	      Transaction tx=null;
	      try{
	    	    s=HibernateUtil.getSession();
	    	    tx=s.beginTransaction();
	    	    s.save(user);
	    	    tx.commit();
	      }catch(HibernateException e)
	      {
	    	    if(tx!=null){
	    	    	tx.rollback();
	    	    	throw e;
	    	    }
	      }finally
	      {
	    	  if(s!=null)
	    	  {
	    		  s.close();
	    	  }
	      }
   }
   
   
   static void addUser2(User user)
   {
	      Session s=null;
	      Transaction tx=null;
	      try{
	    	    s=HibernateUtil.getSession();
	    	    tx=s.beginTransaction();
	    	    s.save(user);
	    	    tx.commit();
	      }finally
	      {
	    	  if(s!=null)
	    	  {
	    		  s.close();
	    	  }
	      }
   }
   
   /**
    * hibernate查询数据不需要开启事务
    * @param id
    * @return
    */
   
   //获取数据 get
   static User getUser(int id)
   {
	      Session s=null;
	      try{
	    	    s=HibernateUtil.getSession();
	    	   
	    	    Class classuser=User.class;
	    	    User user=(User)s.get(User.class, id);
	    	    return user;
	      }finally
	      {
	    	  if(s!=null)
	    	  {
	    		  s.close();
	    	  }
	      }
   }
   
   //获取数据 load
   static User loadUser(int id)
   {
	      Session s=null;
	      try{
	    	    s=HibernateUtil.getSession();
	    	    Class classuser=User.class;
	    	    User user=(User)s.load(User.class, id);
	    	    return user;
	      }finally
	      {
	    	  if(s!=null)
	    	  {
	    		  s.close();
	    	  }
	      }
   }
   
   static void query(String name){
	     Session session=null;
	     try{
	    	 session=HibernateUtil.getSession();
	    	 String hql="from User as u";
	    	 Query q=session.createQuery(hql);
	    	// q.setString("name", name);
	    	 List<User> l=q.list();
	    	 for(User u:l){
	    		 System.out.println(u.getName().getFirstName());
	    	 }
	     }finally{
	    	 
	     }
   }
}

现在我们来看表结构 命令行输入 show create table user;

CREATE TABLE `user` (
  `id` int(11) NOT NULL auto_increment,
  `frist_name` varchar(255) default NULL,
  `last_name` varchar(255) default NULL,
  `birthday` datetime default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
看两个名称是不是都在用户表里了呢?
现在明白了吧!

好了 现在我们来对关联关系查询规律总结下

关联关系总结
一对一关系 在查主对象数据的时候,是以一种左外连接的方式把从表和主表数据全都查询出来的 只有一条select语句 但是要是
查从表的数据,是分两次查询的,一次是查从表数据,一次是查主表数据 其它关系都是分两次查询的 比如多对多 一对多 多对一
关系的查询 不管是查主表还是从表数据,它都会进行两次查询 

end 完毕!

 

分享到:
评论

相关推荐

    hibernate组件之间的关联

    在 Hibernate 中,组件之间的关联是实现对象模型与数据库表之间映射的关键部分,它包括了一对一、一对多、多对一、多对多等多种关联类型。本篇文章将深入探讨 Hibernate 组件之间的关联机制及其应用。 **一对一关联...

    易语言本人刚刚编写的进度条与组件的关联动作

    本篇将详细探讨在易语言中如何编写进度条与组件的关联动作。 首先,我们要了解易语言中的“进度条”组件。在易语言中,进度条通常称为“进度指示器”,它可以设置为水平或垂直样式,通过调整其数值来显示任务的完成...

    vuejs组件-选择人员

    Vue.js 是一款流行的前端JavaScript框架,它以组件化开发为核心,极大地提高了开发效率和代码复用性。在“vuejs组件-选择人员”这个主题中,我们主要关注的是如何使用Vue.js来创建一个用于选择人员的组件。下面将...

    flex做拓扑图的组件

    3. **数据绑定**:Flex支持数据绑定,这意味着你可以将拓扑图的结构与数据模型关联起来。通过改变数据模型,拓扑图的显示会自动更新,反之亦然,这大大简化了复杂图表的管理。 4. **自定义组件**:拓扑图组件通常...

    BCF关联工具修改BCF文件和启动游戏组件(BCF relational tools)

    1. 文件关联:BCF关联工具允许用户将BCF文件与特定的游戏组件关联起来,这样在打开文件时,工具会自动识别并应用相应的解析规则,使用户能更方便地查看和修改游戏数据。 2. 内容编辑:用户可以通过工具提供的界面...

    com组件注册查看器

    2. 查找特定组件的详细信息,比如其关联的程序、文件位置等。 3. 对比不同时间点的注册信息,帮助识别可能的更改或异常。 4. 解决注册错误,比如当某个应用程序无法启动,可能是因为依赖的COM组件未正确注册。 5. 在...

    aspcn组件 上传组件 VB ASP原程序

    标签是对资源主题的精炼概括,强调了此资源与aspcn组件、上传功能、VB编程语言以及ASP开发环境的关联性。这些标签有助于用户快速识别资源的主要技术特性,便于搜索和分类。 【文件名称列表】:aspcn组件 由于提供...

    Cocos2d-x 3.0 开发(十)使用CocoStudio场景编辑器关联组件

    我们有了UI交互、有了动画人物、有了物理模拟,还差最后一步——将这些元素融合起来。这次我们使用cocoStudio中的场景编辑器,将先前做过的所有东西都放到一个场景中去。相关博客:...

    a-tree 树型选择菜单组件关联节点选中动态设置

    菜单多选设置,可用于权限多选,菜单多选等更多多选场景内使用。描述,通过树型弹框可以点击选择不同节点,且动态关联节点...如果勾选,则选中父节点则子节点自动选中,取消反选,如果取消勾选,则父子节点没有关联;

    Linux下Com组件例子

    在IT行业中,COM(Component Object Model)组件通常与微软的操作系统Windows紧密关联,它是一种对象导向的技术,允许软件组件之间进行交互。然而,标题提到的是"Linux下C++ COM组件demo",这意味着我们将讨论如何在...

    layui_修改了树型结构的父选项与子选项关联的问题.rar

    标题"layui_修改了树型结构的父选项与子选项关联的问题.rar"暗示了用户在使用LayUI的树形组件时遇到了一个问题,这个问题可能涉及到父节点与子节点之间的关联不正确,导致数据展示或操作上存在异常。在LayUI的树形...

    delphi7组件参考大全

    虽然一个TBitBtn组件只能与一个位图相关联,但该位图可以平分为4个部分,分别在按钮处于弹起、按下、禁止和单机状态时显示。 2、TSpeedButton组件:该组件是一个按钮,用于执行一个命令。该组件与Tbutton、Tbitbtn...

    易语言使用变量数组来无限复制组件源码

    事件处理程序`是一个函数,它允许我们将事件处理代码与特定的组件关联起来。 总结一下,易语言中利用变量数组复制组件源码的关键步骤包括: 1. 定义变量数组来存储组件对象。 2. 创建组件实例,并将其添加到数组中...

    通过组件ID修改组件内容.zip

    在Java代码中,我们可以使用`findViewById()`方法来获取与特定ID关联的组件。例如,如果我们有一个ID为"my_button"的按钮,我们可以通过以下方式获取它: ```java Button myButton = (Button) findViewById(R.id.my...

    如何在C++Builder2007中安装自己的组件

    在C++Builder2007中安装自定义组件的过程与早期版本有所不同,因为"Install Component"选项不再直接出现在菜单中。然而,用户仍然可以通过创建和编译包(Package)来安装自定义组件。以下是详细步骤: 1. **新建...

    如何实现多数据表关联呢?Delphi的方法实例..rar

    本文将深入探讨在Delphi中如何实现多数据表关联,主要关注TDataSet组件、TTable、TQuery、TDataSource以及SQL语句的应用。 1. **TDataSet组件**:在Delphi中,TDataSet是所有数据集类的基类,它提供了一种抽象的...

    LR 关联高级篇

    2. **关联组件**:LR提供了多种关联组件,如Web_reg_save_param、Web_reg_save_param_ex、Web_reg_find等,它们分别有不同的用途和使用场景。 3. **正则表达式**:在LR中,通常使用正则表达式来识别和提取动态数据...

    关联菜单_全国省份-城市js

    关联菜单_全国省份-城市,无刷新多级关联菜单 ,简洁好用

    Android四大组件简述

    每个Activity都有一个与之关联的布局文件,用于定义屏幕上的视图元素。当用户启动一个应用或者在应用之间切换时,系统会创建或恢复相应的Activity。Activity有多种生命周期状态,包括运行、暂停、停止和销毁,开发者...

Global site tag (gtag.js) - Google Analytics