`
L.G.Alexander
  • 浏览: 158390 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

4、对象模型映射

阅读更多
对象模型映射
OA里面有机构,我们需要创建一个机构的对象Organization,如下:
package com.oa.model;

import java.util.Set;

/**
 * @author lukuijun@hanqinet.com
 * @hibernate.class table="t_organization"
 */
public class Organization {
	/**
	 * @hibernate.id generator-class="native"
	 */
	private int id;
	/**
	 * @hibernate.property
	 */
	private String name;
	/**
	 * @hibernate.property
	 */
	private String sn;//机构编号
	/**
	 * @hibernate.property
	 */
	private String description;
	/**
	 * @hibernate.many-to-one column="pid"
	 */
	private Organization parent;//一个机构的上级机构
	/**
	 * @hibernate.set
	 * @hiberante.key  column="pid"
	 * @hibernate.one-to-many class="com.oa.model.Organization"
	 */
	private Set<Organization> children;//一个机构的子机构(一个机构有多个子机构,所以是一对多的关系)

	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 String getSn() {
		return sn;
	}

	public void setSn(String sn) {
		this.sn = sn;
	}

	public String getDescription() {
		return description;
	}

	public void setDescription(String description) {
		this.description = description;
	}

	public Organization getParent() {
		return parent;
	}

	public void setParent(Organization parent) {
		this.parent = parent;
	}

	public Set<Organization> getChildren() {
		return children;
	}

	public void setChildren(Set<Organization> children) {
		this.children = children;
	}
}

OA里面不但有机构Organization,还有人员Person,我们定义一个Person对象,它有一个Organization属性,如下:
package com.oa.model;
/**
 * @author lukuijun@hanqinet.com
 * @hibernate.class table="t_person"
 */
public class Person {
	/**
	 * @hibernate.id generator-class="native"
	 */
	private int id;
	/**
	 * @hibernate.property
	 */
	private String name;
	/**
	 * @hibernate.property
	 */
	private String sex;
	/**
	 * @hibernate.property
	 */
	private String address;
	/**
	 * @hibernate.property
	 */
	private String duty;
	/**
	 * @hibernate.property
	 */
	private String phone;
	/**
	 * @hibernate.property
	 */
	private String description;
	/**
	 * @hibernate.many-to-one
	 */
	private Organization org;

	public Organization getOrg() {
		return org;
	}

	public void setOrg(Organization org) {
		this.org = org;
	}

	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 String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	public String getDuty() {
		return duty;
	}

	public void setDuty(String duty) {
		this.duty = duty;
	}

	public String getPhone() {
		return phone;
	}

	public void setPhone(String phone) {
		this.phone = phone;
	}

	public String getDescription() {
		return description;
	}

	public void setDescription(String description) {
		this.description = description;
	}
}
运行ant生成Person.hbm.xml和Organization.hbm.xml映射文件,如下:
Person.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-

mapping-3.0.dtd">
<hibernate-mapping>
  <class table="t_person" name="com.oa.model.Person">
    <id access="field" name="id">
      <generator class="native"/>
    </id>
    <property name="name" access="field"/>
    <property name="sex" access="field"/>
    <property name="address" access="field"/>
    <property name="duty" access="field"/>
    <property name="phone" access="field"/>
    <property name="description" access="field"/>
  </class>
</hibernate-mapping>

Organization.hbm.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-

mapping-3.0.dtd">
<hibernate-mapping>
  <class table="t_organization" name="com.oa.model.Organization">
    <id access="field" name="id">
      <generator class="native"/>
    </id>
    <property name="name" access="field"/>
    <property name="sn" access="field"/>
    <property name="description" access="field"/>
    <many-to-one column="pid" access="field" name="parent"/>
    <set access="field" name="children">
      <key/>
      <one-to-many class="com.oa.model.Organization"/>
    </set>
  </class>
</hibernate-mapping>
接下来启动Tomcat服务器,在Tomcat启动时,它会读取Hibernate的映射和配置文件,同时在数据库里面生成表t_organization和表t_person。
测试是否在数据库确实能插入数据,这时需要添加junit-3.8.2.jar包。
测试,先写一个测试类的常用工具类:
package com.oa.model;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HiberanteUtils {
	private static SessionFactory factory = null;
	static {
		try {
			Configuration cfg = new Configuration().configure();
			factory = cfg.buildSessionFactory();
		} catch (HibernateException e) {
			e.printStackTrace();
		}
	}
	@SuppressWarnings("unused")
	public static SessionFactory getSessionFactory(){
		return factory;
	}
	public static Session getSession(){
		return factory.openSession();
	}
	public static void closeSession(Session session){
		if(session != null)
			if(session.isOpen())
				session.close();
	}
}
接着写测试类的测试方法:
package com.oa.model;
import java.util.HashSet;
import java.util.Set;
import org.hibernate.Session;
import junit.framework.Assert;
import junit.framework.TestCase;
public class OrganizationTest extends TestCase {
	public void testGetParent() {
		Session session = null;
		try {
			session = HiberanteUtils.getSession();
			session.beginTransaction();
			//childen --> parent //while load childen load parent
			Organization org2 = (Organization) session.load(Organization.class, "2");
			Assert.assertEquals("org2", org2.getName());
			Assert.assertEquals("org1", org2.getParent().getName());
			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	public void testGetChildren() {
		Session session = null;
		try {
			session = HiberanteUtils.getSession();
			session.beginTransaction();
			//parent --> childen //while load parent load childen
			Organization org1 = (Organization) session.load(Organization.class, "1");
			Assert.assertEquals("org1", org1.getName());
			Set<Organization> set = org1.getChildren();
			for(Organization org : set){
				Assert.assertEquals(true, "org2org3org4".contains(org.getName()));
			}
			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void testSetChildren() {
		Session session = null;
		try {
			session = HiberanteUtils.getSession();
			session.beginTransaction();
			
			Organization org1 = new Organization();
			org1.setName("org1");
			Set<Organization> set = new HashSet<Organization>();
			Organization org2 = new Organization();
			org2.setName("org2");
			set.add(org2);
			
			Organization org3 = new Organization();
			org3.setName("org3");
			set.add(org3);
			
			Organization org4 = new Organization();
			org2.setName("org4");
			set.add(org4);
			
			org1.setChildren(set);
			
			session.save(org1);
			session.save(org2);
			session.save(org3);
			session.save(org4);
			
			Assert.assertEquals("org1", ((Organization) session.load(Organization.class, "1")).getName());
			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
测试成功。
注意hibernate.cfg.xml的<property name="hibernate.hbm2ddl.auto">update</property>,它只有两个取值,create和update。create会删除

以前的重新创建,update不会删除会更新。














分享到:
评论

相关推荐

    对象关系映射模型

    ### 对象关系映射模型详解 #### 一、对象关系映射(ORM)概念解析 对象关系映射(Object Relational Mapping,简称ORM)是一种编程技术,用于将关系型数据库中的数据与面向对象编程语言中的对象进行转换。这种技术...

    Offic对象模型大全.part2(CHM)

    VBAGR10.CHM │ ├─Office 对象模型 │ VBAOF11.CHM │ ├─Outlook 对象模型 │ VBAOL11.CHM │ ├─PowerPoint 对象模型 │ VBAPP10.CHM │ ├─Publisher 对象模型映射 │...

    Offic对象模型大全.part1(CHM)

    VBAGR10.CHM │ ├─Office 对象模型 │ VBAOF11.CHM │ ├─Outlook 对象模型 │ VBAOL11.CHM │ ├─PowerPoint 对象模型 │ VBAPP10.CHM │ ├─Publisher 对象模型映射 │...

    Offic对象模型大全.part3(CHM)

    VBAGR10.CHM │ ├─Office 对象模型 │ VBAOF11.CHM │ ├─Outlook 对象模型 │ VBAOL11.CHM │ ├─PowerPoint 对象模型 │ VBAPP10.CHM │ ├─Publisher 对象模型映射 │...

    ORM对象关系映射

    对象关系映射(ORM)是一种概念性的、易于理解的模型化数据的方法,基于三个核心原则:简单、传达性、精确性。ORM 方法论提供了概念性的模型化数据的方法,基于数据模型创建正确标准化了的结构。ORM 专门被设计为...

    IEC61850第80-4部分:COSEM对象模型(IEC62056)至IEC61850数据模型的映射

    将 COSEM 对象模型映射到 IEC 61850 数据模型中具有重要的实际意义。这种映射可以实现不同标准之间的互操作性,使得采用 COSEM 的智能电表等设备能够无缝地集成到遵循 IEC 61850 标准的自动化系统中。 #### 映射的...

    基于本体语义的模型映射研究

    例如,在面向对象模型中,类与类之间的继承关系。 2. **结构层映射**:这一层次更具体地涉及到模型内部的结构特征,如属性、操作等。结构层映射不仅要考虑概念的对应关系,还要考虑这些概念如何组合成更复杂的结构...

    MongoDB、Java与对象关系映射

    ### MongoDB、Java与对象关系映射 #### MongoDB简介与特性 MongoDB作为一种强大的NoSQL数据库,在处理非结构化数据方面有着显著的优势。它通过使用JSON(JavaScript Object Notation)格式来存储和检索数据,简化...

    VC++ 2005(5):指针与对象模型

    指针是C++语言的精髓,也是C++语言的难点,由于...C++/CLI中的指针类型完整映射了ISO-C++本地世界和CLI托管世界所包含的所有对象模型。本课程将从本地对象模型和托管对象模型入手,步步深入,探讨C++/CLI中的各种指针。

    dotnet-BatMap基于约定的快速对象映射器

    在.NET开发中,对象映射是将一个对象的属性值复制到另一个对象的过程,通常用于数据库操作、数据传输对象(DTO)转换或不同数据模型之间的数据迁移。 BatMap是一个高效且易用的库,专门设计用于.NET平台,提供基于...

    MMS对象与61850对象的映射

    为了实现MMS对象与IEC 61850对象之间的映射,需要考虑两个方面的内容:一是如何将IEC 61850的数据模型映射到MMS的模型中;二是如何在具体实现过程中处理这些映射关系。 ##### 数据模型的映射 根据IEC 61850标准的...

    对象-关系数据库之间的映射

    因此,将对象模型映射到关系模型中需要进行一些策略性的选择和妥协。 在将对象映射到关系数据库的过程中,有几个关键的技术点需要注意: 1. **将属性映射成列**:对象的属性可以映射为数据库的列,但并非所有属性...

    将对象映射到关系数据库详解

    ### 将对象映射到关系数据库详解 #### 一、引言 随着现代软件开发项目的不断...通过理解不同的映射策略和技术,开发人员可以有效地克服对象模型与关系数据库模型之间的阻抗失配问题,构建出高性能且易于维护的系统。

    欧柏泰克:java中对象模型与数据库中的关系模型

    欧柏泰克在此背景下,讨论了如何在Java中建立对象模型,并将其映射到关系数据库模型。 在Java中,我们经常使用ORM框架,如Hibernate,来处理这种映射。例如,给定的代码片段展示了Hibernate注解配置的一个实例。`@...

    Ruby-Her一个ORM对象关系映射将REST资源映射成Ruby对象

    1. **模型映射**:Her允许定义模型类,这些类与REST资源对应,提供了一种面向对象的方式来操作数据。例如,`class User 将User模型与API中的/users资源关联。 2. **关联关系**:Her支持关联模型,如一对一、一对多...

    论文研究-对象关系模型及其应用 .pdf

    在关系型数据库中,数据和行为被严格分离,通常以二维表形式存储,而面向对象模型则将数据和行为封装在对象中,允许继承和多态性。这导致了在使用关系型数据库构建系统时,数据模型和计算模型之间存在根本差异,使得...

Global site tag (gtag.js) - Google Analytics