一、普通组件映射配置

1、创建组件类,代码如下:

package learn.hibernate.bean;

/**
* 组件类
*/
public class Phones { private String companyPhone;
private String homePhone;
private String personalPhone; public Phones() { } public Phones(String companyPhone, String homePhone, String personalPhone) {
super();
this.companyPhone = companyPhone;
this.homePhone = homePhone;
this.personalPhone = personalPhone;
} @Override
public String toString() {
return "Phones [companyPhone=" + companyPhone + ", homePhone="
+ homePhone + ", personalPhone=" + personalPhone + "]";
} public String getCompanyPhone() {
return companyPhone;
}
public void setCompanyPhone(String companyPhone) {
this.companyPhone = companyPhone;
}
public String getHomePhone() {
return homePhone;
}
public void setHomePhone(String homePhone) {
this.homePhone = homePhone;
}
public String getPersonalPhone() {
return personalPhone;
}
public void setPersonalPhone(String personalPhone) {
this.personalPhone = personalPhone;
}
}
package learn.hibernate.bean;

/**
* 组件类
*/
public class Address { private String zipCode;
private String address; public Address() {
super();
} public Address(String zipCode, String address) {
super();
this.zipCode = zipCode;
this.address = address;
} @Override
public String toString() {
return "Address [zipCode=" + zipCode + ", address=" + address + "]";
}
public String getZipCode() {
return zipCode;
}
public void setZipCode(String zipCode) {
this.zipCode = zipCode;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}

2、将组件类作为属性放入到主类中,代码如下:

package learn.hibernate.bean;

import java.util.Date;

/**
* 持久化类
*/
public class Person { private Integer id;
private String name;
private int age;
private int passwork;
private Date birthday;
// 组件实例
private Address addres;
// 组件实例
private Phones phone; public Person() { } public Person(String name, int age, int passwork, Date birthday) {
super();
this.name = name;
this.age = age;
this.passwork = passwork;
this.birthday = birthday;
} @Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age
+ ", passwork=" + passwork + ", birthday=" + birthday + "]";
} public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getPasswork() {
return passwork;
}
public void setPasswork(int passwork) {
this.passwork = passwork;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
} public Address getAddres() {
return addres;
} public void setAddres(Address addres) {
this.addres = addres;
} public Phones getPhone() {
return phone;
} public void setPhone(Phones phone) {
this.phone = phone;
} }

3、配置文件,代码如下:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="learn.hibernate.bean">
<class name="Person" table="t_person">
<id name="id" column="person_id">
<generator class="native"/>
</id>
<property name="name" column="t_name"/>
<property name="age"/>
<property name="passwork"/>
<property name="birthday"/>
<!--
组件类的映射配置
component 指定需要映射的组件类
name 指定 Person 中组件属性的变量名称
name的值"addres" 与 Person 中定义的要一致
-->
<component name="addres">
<property name="zipCode"/>
<property name="address"/>
</component> <component name="phone">
<property name="companyPhone"/>
<property name="homePhone"/>
<property name="personalPhone"/>
</component>
</class>
</hibernate-mapping>

4、测试代码:

@Test
public void testComponent() {
Person p = new Person("sdf",23,123456,new Date());
Address address = new Address("410000","湖南长沙");
Phones phone = new Phones("07318678987","0731876567","15114565678");
// person 与 address 关联
p.setAddres(address);
// person 与 phone 关联
p.setPhone(phone); tx = session.beginTransaction(); session.persist(p); tx.commit(); }

二、动态组件映射配置

1、创建类,代码如下:

package learn.hibernate.bean;

import java.util.Date;
import java.util.HashMap;
import java.util.Map; /**
* 持久化类设计
* 注意:
* 持久化类通常建议要有一个持久化标识符(ID)
* 持久化标识符通常建议使用封装类(例如:Integer 因为基本类型存在默认值)
* 持久化类通常建议手动添加一个无参构造函数 (因为有些操作是通过放射机制进行的)
* 属性通常建议提供 getter/setter 方法
* 持久化类不能使用 final 修饰
* 持久化类中如果使用了集合类型数据,只能使用集合所对应的接口类型来声明(List/Map/Set)
* 如下:ArrayList list = new ArrayList(); 不行
* List list = new ArrayList(); 可行
*/
public class Person { private Integer id;
private String name;
private int age;
private int passwork;
private Date birthday;
// 动态组件实例
private Map attribute = new HashMap(); public Person() { } public Person(String name, int age, int passwork, Date birthday) {
super();
this.name = name;
this.age = age;
this.passwork = passwork;
this.birthday = birthday;
} @Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age
+ ", passwork=" + passwork + ", birthday=" + birthday + "]";
} public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getPasswork() {
return passwork;
}
public void setPasswork(int passwork) {
this.passwork = passwork;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
} public Map getAttribute() {
return attribute;
} public void setAttribute(Map attribute) {
this.attribute = attribute;
} }

2、映射配置文件,代码如下:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="learn.hibernate.bean">
<class name="Person" table="t_person">
<id name="id" column="person_id">
<generator class="native"/>
</id>
<property name="name" column="t_name"/>
<property name="age"/>
<property name="passwork"/>
<property name="birthday"/>
<!--
动态组件类的映射配置
dynamic-component 指定需要映射的组件类
name="attribute" 对应持久化类中集合的变量名称
property Map 集合中key映射配置
name 对 Map 集合的key
column 存储 key 所对应的值
type 字段的数据类型
-->
<dynamic-component name="attribute">
<property name="key1" column="t_key1" type="string"/>
<property name="key2" column="t_key1" type="integer"/>
</dynamic-component>
</class>
</hibernate-mapping>

3、测试代码:

@Test
public void testComponent() {
Person p = new Person("sdf",23,123456,new Date());
// 在 Person 中只有声明,也有创建
Map attribute = p.getAttribute();
attribute.put("key1", "hibernate");
attribute.put("key2", 123); tx = session.beginTransaction(); session.persist(p); tx.commit(); }

4、如果在 Person 类中只声明了动态组件,并未创建,如下:

package learn.hibernate.bean;

import java.util.Date;
import java.util.HashMap;
import java.util.Map; /**
* 持久化类设计
* 注意:
* 持久化类通常建议要有一个持久化标识符(ID)
* 持久化标识符通常建议使用封装类(例如:Integer 因为基本类型存在默认值)
* 持久化类通常建议手动添加一个无参构造函数 (因为有些操作是通过放射机制进行的)
* 属性通常建议提供 getter/setter 方法
* 持久化类不能使用 final 修饰
* 持久化类中如果使用了集合类型数据,只能使用集合所对应的接口类型来声明(List/Map/Set)
* 如下:ArrayList list = new ArrayList(); 不行
* List list = new ArrayList(); 可行
*/
public class Person { private Integer id;
private String name;
private int age;
private int passwork;
private Date birthday;
// 动态组件实例
private Map attribute; public Person() { } public Person(String name, int age, int passwork, Date birthday) {
super();
this.name = name;
this.age = age;
this.passwork = passwork;
this.birthday = birthday;
} @Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age
+ ", passwork=" + passwork + ", birthday=" + birthday + "]";
} public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getPasswork() {
return passwork;
}
public void setPasswork(int passwork) {
this.passwork = passwork;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
} public Map getAttribute() {
return attribute;
} public void setAttribute(Map attribute) {
this.attribute = attribute;
} }

5、那么在测试代码需要创建一个,代码如下:

@Test
public void testAttribute() {
Person p = new Person("sdf",23,123456,new Date());
// 在 Person 中只有声明,没有创建
Map attribute = new HashMap();
attribute.put("key1", "hibernate");
attribute.put("key2", 123);
p.setAttribute(attribute); tx = session.beginTransaction(); session.persist(p); tx.commit(); }

6、查询,测试代码:

@Test
public void testGetAttribute() {
Person p = (Person)session.get(Person.class, 1);
System.out.println(p); // 高效操作 map 集合
Iterator<Map.Entry> it = p.getAttribute().entrySet().iterator(); for(;it.hasNext();){
Map.Entry map = it.next();
System.out.println(map.getKey()+"---------"+map.getValue());
}
}

Hibernate学习---第五节:普通组件和动态组件的更多相关文章

  1. VUE2.0实现购物车和地址选配功能学习第五节

    第五节 单件商品金额计算和单选全选功能 1.vue精髓在于操作data模型来改变dom,渲染页面,而不是直接去改变dom 2.加减改变总金额功能: html:<div class="c ...

  2. Vue组件的操作-自定义组件,动态组件,递归组件

    作者 | Jeskson 来源 | 达达前端小酒馆 v-model双向绑定 创建双向数据绑定,v-model指令用来在input,select,checkbox,radio等表单控件.v-model指 ...

  3. Vue两种组件类型介绍:递归组件和动态组件

    一递归组件 递归组件的特性就是可以在自己的template模板中调用自己本身.值得注意的它必须设置name属性. // 递归组件 recursive.vue <template> < ...

  4. [Vue]组件——实现动态组件:keep-alive的使用

    1.在app.vue中用一个 <keep-alive> 元素将其动态组件包裹起来: keepAlive为true时,第一次被创建的时候缓存下来,为false时,不会缓存 <keep- ...

  5. Vue 组件4 动态组件

    动态组件 通过使用保留的<component>元素,动态的绑定到它的is特性,我们让多个组件同时使用同一个挂载点,并动态切换: var vm = new Vue({ el: '#examp ...

  6. Vue_(组件通讯)动态组件结合keep-alive

    keep-alive 传送门 <keep-alive> 包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们.和 <transition> 相似,<keep-alive ...

  7. Vue_(组件通讯)动态组件

    动态组件 传送门 在一个元素上挂载多个组件,根据不同状态进行切换的时候,可以使用动态组件 动态组件的使用:需要使用内置组件<component></component>,根据 ...

  8. Vue.js的组件(slot/动态组件等)、单文件组件、递归组件使用

    一.组件 1> 组件命名方式有两种(注意:在DOM模板中只有kebab-case命名方法才生效): html中引用组件: <!-- 在DOM模板中,只有 kebab-case命名才生效 - ...

  9. Hibernate征途(五)之继承映射和组件映射

    之所以把这两种映射放到一起说,是因为二者都是以复用为目的,减少了代码和配置量,这是相同点:二者之间的不同点类似继承和实现的区别:继承的类是一个事物的抽象,而实现的接口仅仅是功能的抽象. 继承映射 如上 ...

随机推荐

  1. JS常用的设计模式(11)—— 中介者模式

    中介者对象可以让各个对象之间不需要显示的相互引用,从而使其耦合松散,而且可以独立的改变它们之间的交互. 打个比方,军火买卖双方为了安全起见,找了一个信任的中介来进行交易.买家A把钱交给中介B,然后从中 ...

  2. Android 6 Marshmallow USB调试授权

    Google在Android在5.1版之后进行了重大变革,推出了Android 6 Marshmallow,我们先看看当它接上工作站时,有什么样的状况出现. 如图1所示,会弹出一个窗口,[是否允许此计 ...

  3. 学生信息管理系统应用ios源码iPad版

    学生信息管理系统应用iPad版,该应用源码比较完整的,而且也很详细,这也是一款学校用的学生和老师管理系统,里面涉及到了很多ipad常用的控件,操作和数据存储. <ignore_js_op> ...

  4. Aspose插件

    Eclipse安装地址: http://apps.aspose.com/marketplace/eclipse/asposewizardrepo

  5. float:left居中对齐

    <div class="M1180"><div class="services"> <div class="serv_c ...

  6. Windows下安装Elasticsearch

    1.下载elasticsearch-1.6.0 .jdk-7u67-windows-x64.exe 1.6.0必须用jdk1.7才能运行 2.配置JAVA_HOME:C:\Program Files\ ...

  7. Hadoop在win7下部署的问题

    问题: 为了测试方便所以在win7下部署了伪分布式hadoop运行环境,但是部署结束后在命令行运行hadoop命令创建一个用户文件目录时出现了一下情况: 系统找不到指定的批标签- make_comma ...

  8. (转)浅谈HTML5与css3画饼图!

    神马系饼图? 饼图,大家都应该熟知,在统计数据对比方面,几乎处处用到.如cnzz的统计饼图 从饼图中,很形象地展示了访问者地区的分布,以扇形为块的方式拼成一个大圆. 都使用什么方法实现 目前众多站点制 ...

  9. Java迷题:等于,还是不等于?

    等于还是不等于? 看来看下面的一段代码: public static void main(final String[] args) { Integer a = new Integer(100); In ...

  10. LinkedList存储一副扑克牌,实现洗牌功能。

    package cd.itcast.runble; import java.util.LinkedList; import java.util.Random; /** * LinkedList存储一副 ...