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组件映射的更多相关文章

  1. hibernate 组件映射

    注解方式:   import javax.persistence.Embedded; import javax.persistence.Entity; import javax.persistence ...

  2. hibernate学习四(关系映射一对一与组件映射)

    一.关系映射简介 在数据库中,表与表的关系,仅有外键.但使用hibernate后,为面向对象的编程,对象与对象的关系多样化:如 一对一,一对多,多对多,并具有单向和双向之分. 开始练习前,复制上一次项 ...

  3. hibernate(七)组件映射与多对一映射

    一.组件映射 用注解配置组件映射: Husband为我们映射的类,wife是这个类的一部分(属性不能与husband中属性重名,不要写Entity注解,不要有主键) Husband类:(在getWif ...

  4. Hibernate之组件映射

    1:为什么要使用组件映射 答:建立关系数据模型的一个重要原则是在不会导致数据冗余的前提下,尽可能减少数据库表的数目及表之间的外键参照关系.以员工信息为例,员工信息中有员工的家庭地址信息,如果把地址信息 ...

  5. Hibernate中一对一关联映射/组件映射

    Hibernate映射:一对一关联 1.按照外键映射 2.按照主键映射 组件映射 下面以员工账号表和员工档案表(员工账号和档案表之间是一对一的关系)为例,介绍这两种映射关系,并使用这两种 映射方式分别 ...

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

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

  7. .Hibernate一对一映射与组件映射

    1.按照外键映射(Hibernate提供了两种映射一对一关联关系的方式:按照外键映射和按照主键映射) 实现需要: 创建实体类Users1和Resume1 public class Users1 { p ...

  8. Hibernate第九篇【组件映射、继承映射】

    前言 到目前位置,我们已经学习了一对一.一对多.多对一.多对多映射了-既然Hibernate是ORM实现的框架,它还提供了组件映射和继承映射..本博文主要讲解组件映射和继承映射 Java主要的类主要有 ...

  9. 【学习笔记】Hibernate 一对一关联映射 组件映射 二级缓存 集合缓存

    啊讲道理放假这十天不到啊 感觉生活中充满了绝望 这就又开学了 好吧好吧继续学习笔记?还是什么的 一对一关联映射 这次我们仍然准备了两个表 一个是用户表Users 一个是档案表Resume 他们的关系是 ...

随机推荐

  1. disabled="true" 的标签元素不可提交

    把jsp页面的input 标签设置成不可编辑: <input  name="Id"    value="${order.Id}" readOnly=&qu ...

  2. JS与Jquery区别

    很多人对JS和JQuery很容易搞混淆,今天我们就相比学习下: 加载区别: var myfunction(){}; JS:1.window.onload=function(){} 2.<body ...

  3. Java中随机数的产生方式与原理

    查阅随机数相关资料,特做整理 首先说一下java中产生随机数的几种方式 在j2se中我们可以使用Math.random()方法来产生一个随机数,这个产生的随机数是0-1之间的一个double,我们可以 ...

  4. git 常用指令

    下载项目 git clone https://git.oschina.net/jianqingwang/jianblog.git 注意,clone跟的是项目地址 查看分支(也就是版本) git bra ...

  5. JS字符串反序输出

    function IsReverse(text){ return text.split('').reverse().join(''); } IsReverse("你是我的小丫小苹果" ...

  6. 【requireJS源码学习02】data-main加载的实现

    前言 经过昨天的学习,我们大概了解到了requireJS的主要结构,这里先大概的回顾一下 首先从总体结构来说,require这里分为三块: ① newContext之前变量声明或者一些工具函数 ② n ...

  7. vs2012使用64位IIS EXPRESS调试

    使用Visual Studio 2012开发网站或web应用程序时,可以使用两种web server.自带的development server和IIS EXPRESS.development ser ...

  8. javascript中concat方法深入理解

    最近在恶补js知识的时候,总是会因为js强大的语法而感到震撼.因为以前对前端方面的疏忽,导致了一些理解的错误.因此痛改前非,下定决心,不管做什么事情,都要有专研的精神. 在介绍前,抛出一个问题:如何将 ...

  9. MYSQL进阶,新手变司机

    一.视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用. SELECT * FROM ( S ...

  10. sharepoint2013爬xls文件:Error initializing IFilter for extension的解决方案

    最近sharepoint2013爬网出现: error initializing IFilter for extension '.xls' (Error code is 0x80030002). Th ...