Hibernate组件映射
Hibernate联合主键映射以及组件映射
在Hibernate中联合主键的形成有两种可能:一种是由多对多映射形成的,多对多映射会形成第三张表,一般来说第三张表的主键是由其他两张表的主键构成的(比如学生表,课程表,选课表)。第二种情况就是很常见的情况,即只有一张表,表的主键是由本身的两个字段或以上构成的。比如:公司的财务统计表,其中有字段年份、月份、销售金额。在这张表中年份和月份才唯一确定一条记录。下面就来说说联合主键第二种情况的配置,就以上面的财务统计表来说明。对于联合主键的这种情况,我们经常把表中的主键字段提取出来单独作为一个类,其他字段则作为另一个类。对于财务统计表来说,我们则把年份和月份作为一个类SalDate,在另一个类则包含引用这个类和其他的字段。
假设我们有两个类,SalDate类表示联合主键(year、month),Total类(private int salTotal;private SalDate sd;)建完这两个类之后我们开始写Total.hbm.xml的配置文件:
<hibernate-mapping package="com.fendou.hibernate">
<class name="Total" table="t_salTotal">
<composite-id name="sd">
<key-property name="year"/>
<key-property name="month"/>
</composite-id>
<property name="salTotal" length="50" column="sTotal"/> </class>
</hibernate-mapping>
运行下,出现下面结果:
create table t_salTotal (year integer not null, month integer not null, sTotal integer, primary key (year, month))
没有问题。下面我们插入几条数据测试下:
session = HibernateUtils.getSession();
//开启事务
tr = session.beginTransaction();
SalDate d1 = new SalDate();
d1.setMonth(12);
d1.setYear(2010); SalDate d2 = new SalDate();
d2.setMonth(12);
d2.setYear(2010); Total t1 = new Total();
t1.setSalTotal(10000);
t1.setSd(d1); Total t2 = new Total();
t2.setSalTotal(30000);
t2.setSd(d2);
session.save(t1);
session.save(t2);
tr.commit();
运行下:结果报错了:20:55:57,078 WARN RootClass:215 - composite-id class does not override hashCode(): com.fendou.hibernate.SalDate
组件映射:组件映射相对比较简单,所谓的组件就是一个被包含的对象。比如我们可以将通讯方式设置为一个组件,这个组件里面包含(QQ,MSN,Email,住址),而其他的对象皆可以使用这个组件,比如Teacher对象、Student对象。
组件对象代码如下:
package com.fendou.hibernate;
public class Component {
private String name;
private String tel;
private String address;
private String email;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
} public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
} }
使用组件的Teacher对象如下:
package com.fendou.hibernate;
public class Teacher {
private int id;
private int sal;
public Component getComp() {
return comp;
}
public void setComp(Component comp) {
this.comp = comp;
}
private Component comp;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
} public int getSal() {
return sal;
}
public void setSal(int sal) {
this.sal = sal;
} }
配置文件如下:
<hibernate-mapping package="com.fendou.hibernate">
<class name="Teacher" table="t_teacher">
<id name="id" column="tid" length="2">
<generator class="native"></generator>
</id>
<property name="sal" />
<component name="comp">
<property name="name"/>
<property name="tel"/>
<property name="email"/>
<property name="address"/>
</component>
</class>
</hibernate-mapping>
Hibernate组件映射的更多相关文章
- hibernate 组件映射
注解方式: import javax.persistence.Embedded; import javax.persistence.Entity; import javax.persistence ...
- hibernate学习四(关系映射一对一与组件映射)
一.关系映射简介 在数据库中,表与表的关系,仅有外键.但使用hibernate后,为面向对象的编程,对象与对象的关系多样化:如 一对一,一对多,多对多,并具有单向和双向之分. 开始练习前,复制上一次项 ...
- hibernate(七)组件映射与多对一映射
一.组件映射 用注解配置组件映射: Husband为我们映射的类,wife是这个类的一部分(属性不能与husband中属性重名,不要写Entity注解,不要有主键) Husband类:(在getWif ...
- Hibernate之组件映射
1:为什么要使用组件映射 答:建立关系数据模型的一个重要原则是在不会导致数据冗余的前提下,尽可能减少数据库表的数目及表之间的外键参照关系.以员工信息为例,员工信息中有员工的家庭地址信息,如果把地址信息 ...
- Hibernate中一对一关联映射/组件映射
Hibernate映射:一对一关联 1.按照外键映射 2.按照主键映射 组件映射 下面以员工账号表和员工档案表(员工账号和档案表之间是一对一的关系)为例,介绍这两种映射关系,并使用这两种 映射方式分别 ...
- Hibernate征途(五)之继承映射和组件映射
之所以把这两种映射放到一起说,是因为二者都是以复用为目的,减少了代码和配置量,这是相同点:二者之间的不同点类似继承和实现的区别:继承的类是一个事物的抽象,而实现的接口仅仅是功能的抽象. 继承映射 如上 ...
- .Hibernate一对一映射与组件映射
1.按照外键映射(Hibernate提供了两种映射一对一关联关系的方式:按照外键映射和按照主键映射) 实现需要: 创建实体类Users1和Resume1 public class Users1 { p ...
- Hibernate第九篇【组件映射、继承映射】
前言 到目前位置,我们已经学习了一对一.一对多.多对一.多对多映射了-既然Hibernate是ORM实现的框架,它还提供了组件映射和继承映射..本博文主要讲解组件映射和继承映射 Java主要的类主要有 ...
- 【学习笔记】Hibernate 一对一关联映射 组件映射 二级缓存 集合缓存
啊讲道理放假这十天不到啊 感觉生活中充满了绝望 这就又开学了 好吧好吧继续学习笔记?还是什么的 一对一关联映射 这次我们仍然准备了两个表 一个是用户表Users 一个是档案表Resume 他们的关系是 ...
随机推荐
- disabled="true" 的标签元素不可提交
把jsp页面的input 标签设置成不可编辑: <input name="Id" value="${order.Id}" readOnly=&qu ...
- JS与Jquery区别
很多人对JS和JQuery很容易搞混淆,今天我们就相比学习下: 加载区别: var myfunction(){}; JS:1.window.onload=function(){} 2.<body ...
- Java中随机数的产生方式与原理
查阅随机数相关资料,特做整理 首先说一下java中产生随机数的几种方式 在j2se中我们可以使用Math.random()方法来产生一个随机数,这个产生的随机数是0-1之间的一个double,我们可以 ...
- git 常用指令
下载项目 git clone https://git.oschina.net/jianqingwang/jianblog.git 注意,clone跟的是项目地址 查看分支(也就是版本) git bra ...
- JS字符串反序输出
function IsReverse(text){ return text.split('').reverse().join(''); } IsReverse("你是我的小丫小苹果" ...
- 【requireJS源码学习02】data-main加载的实现
前言 经过昨天的学习,我们大概了解到了requireJS的主要结构,这里先大概的回顾一下 首先从总体结构来说,require这里分为三块: ① newContext之前变量声明或者一些工具函数 ② n ...
- vs2012使用64位IIS EXPRESS调试
使用Visual Studio 2012开发网站或web应用程序时,可以使用两种web server.自带的development server和IIS EXPRESS.development ser ...
- javascript中concat方法深入理解
最近在恶补js知识的时候,总是会因为js强大的语法而感到震撼.因为以前对前端方面的疏忽,导致了一些理解的错误.因此痛改前非,下定决心,不管做什么事情,都要有专研的精神. 在介绍前,抛出一个问题:如何将 ...
- MYSQL进阶,新手变司机
一.视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用. SELECT * FROM ( S ...
- sharepoint2013爬xls文件:Error initializing IFilter for extension的解决方案
最近sharepoint2013爬网出现: error initializing IFilter for extension '.xls' (Error code is 0x80030002). Th ...