主键映射和Hibernate映射
组件映射
类组合关系的映射,也叫做组件映射!
注意:组件类和被包含的组件类,共同映射到一张表!
需求: 如汽车与车轮
代码示例:
1、JavaBean
Wheel.java
package com.gqx.component;
/**
* 车轮
* @author 郭庆兴
*
*/
public class Wheel {
private int count;
private int size;
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
}
Car.java
package com.gqx.component;
public class Car {
private int id;
private String brand;
//车轮
private Wheel wheel;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public Wheel getWheel() {
return wheel;
}
public void setWheel(Wheel wheel) {
this.wheel = wheel;
}
}
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="com.gqx.component"> <class name="Car" table="t_car" > <id name="id"> <generator class="native"></generator> </id> <property name="brand" length="20"></property> <!-- 组件映射 --> <component name="wheel"> <property name="count"></property> <property name="size"></property> </component> </class> </hibernate-mapping>
3、测试程序
package com.gqx.component;
import static org.junit.Assert.*;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.junit.AfterClass;
import org.junit.Test;
import com.gqx.collection.User;
public class App {
private static SessionFactory sf;
static{
sf=new Configuration().configure()
.addClass(Car.class)
.buildSessionFactory();
}
@Test
public void test() {
Session session=sf.openSession();
session.beginTransaction();
//轮子
Wheel wheel=new Wheel();
wheel.setCount(4);
wheel.setSize(40);
//汽车
Car car=new Car();
car.setBrand("BMW");
car.setWheel(wheel);
//保存
session.save(car);
session.getTransaction().commit();
session.close();
}
}
继承映射
如:父类——动物
子类:猫,猴子
1、JavaBean文件
Animal.java
package com.gqx.extends1;
/**
* 动物类
* @author 郭庆兴
*
*/
public abstract class Animal {
private int id;
private String name;
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;
}
}
Cat.java
package com.gqx.extends1;
public class Cat extends Animal {
//抓老鼠
private String catchMouse;
public String getCatchMouse() {
return catchMouse;
}
public void setCatchMouse(String catchMouse) {
this.catchMouse = catchMouse;
}
}
Monkey.java
package com.gqx.extends2;
public class Monkey extends Animal{
//吃香蕉
private String eatBanana;
public String getEatBanana() {
return eatBanana;
}
public void setEatBanana(String eatBanana) {
this.eatBanana = eatBanana;
}
}
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="com.gqx.extends1"> <class name="Cat" table="t_cat" > <id name="id"> <generator class="native"></generator> </id> <property name="catchMouse" length="20"></property> <property name="name" length="20"></property> </class> </hibernate-mapping>
3、测试文件
package com.gqx.extends1;
import static org.junit.Assert.*;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.junit.AfterClass;
import org.junit.Test;
import com.gqx.collection.User;
public class App {
private static SessionFactory sf;
static{
sf=new Configuration().configure()
.addClass(Cat.class)
.buildSessionFactory();
}
@Test
public void test() {
Session session=sf.openSession();
session.beginTransaction();
Cat cat=new Cat();
cat.setName("龙猫");
cat.setCatchMouse("抓小老鼠");
session.save(cat);
session.getTransaction().commit();
session.close();
}
@Test
public void testGet() {
Session session=sf.openSession();
session.beginTransaction();
// Query q=session.createQuery("from Cat");
// List<Cat> list=q.list();
// 如果通过父类查询,需要说明包
Query q=session.createQuery("from com.gqx.extends1.Cat");
List<Animal> list=q.list();
System.out.println(list);
session.getTransaction().commit();
session.close();
}
}
映射文件也可以分为三种类型去实现
一、所有子类映射到一张表 (1张表)
什么情况用?
子类教多,且子类较为简单,即只有个别属性!
好处:因为使用一个映射文件, 减少了映射文件的个数。
缺点:(不符合数据库设计原则)
一个映射文件: Animal.hbm.xml
<?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="com.gqx.extends2"> <class name="Animal" table="t_animal" > <id name="id"> <generator class="native"></generator> </id> <!-- 指定鉴别器字段(区分不同的子类) --> <discriminator column="type_"></discriminator> <property name="name" length="20"></property> <!-- 每个子类都用subclass映射 注意:一定要指定鉴别器字段,否则报错! 鉴别器字段:作用是在数据库中区别每一个子类信息,就是一个列的信息 --> <!-- 子类:猫 discriminator-value: 指定鉴别器字段,即type_字段的值 如果不指定,默认为当前子类的全名 --> <subclass name="Cat" discriminator-value="cat_"> <property name="catchMouse"></property> </subclass> <!-- 子类:狗 --> <subclass name="Monkey" discriminator-value="monkey_"> <property name="eatBanana"></property> </subclass> </class> </hibernate-mapping>
结果如图:

总结:
写法较为简单:所有子类用一个映射文件,且映射到一张表!
但数据库设计不合理!
二、每个类映射一张表(3张表)
数据库
T_anmal (存储父类信息)
T_cat (引用父类的主键)
T_monkey(引用父类的主键)
映射文件
<?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="com.gqx.extends3"> <class name="Animal" table="t_animal" > <id name="id"> <generator class="native"></generator> </id> <property name="name" length="20"></property> <!-- 子类:猫 t_cat key:指定cat表的外键字段 --> <joined-subclass name="Cat" table="t_cat"> <key column="t_animal_id"></key> <property name="catchMouse"></property> </joined-subclass> <!-- 子类:猴子 t_monkey --> <joined-subclass name="Monkey" table="t_monkey"> <key column="t_animal_id"></key> <property name="eatBanana"></property> </joined-subclass> </class> </hibernate-mapping>
总结:
一个映射文件,存储所有的子类; 子类父类都对应表;
缺点:表结构比较负责,插入一条子类信息,需要用2条sql: 往父类插入、往子类插入!
三、(推荐)每个子类映射一张表, 父类不对应表(2张表)
这个时候要把Animal类的id改一下
private String id;
映射文件
<?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="com.gqx.extends4"> <!-- abstract="true" 指定实体对象不对应表,即在数据库端不生成表 --> <class name="Animal" abstract="true"> <!-- 如果用union-subclass节点,主键生成策略不能为自增长 --> <id name="id"> <generator class="uuid"></generator> </id> <property name="name" length="20"></property> <!-- union-subclass table 指定为表名,表的主键即为id列 --> <!-- 子类:猫 t_cat--> <union-subclass name="Cat" table="t_cat"> <property name="catchMouse"></property> </union-subclass> <!-- 子类:猴子 t_monkey--> <union-subclass name="Monkey" table="t_monkey"> <property name="eatBanana"></property> </union-subclass> </class> </hibernate-mapping>
主键映射和Hibernate映射的更多相关文章
- Hibernate(5)—— 联合主键 、一对一关联关系映射(xml和注解) 和 领域驱动设计
俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的知识点总结如下: One to One 映射关系 一对一单向外键(XML/Annotation) 一对一双向外键关联(XML/A ...
- hibernate笔记--基于主键的单(双)向的一对一映射关系
上一节介绍的基于外键的一对一映射关系中,在Person表中有一个外键列idCard_id,对应的idCard表的主键id,至于基于主键的一对一映射关系,就是指Person表中抛弃了idcard_id这 ...
- Hibernate 表映射 主键生成策略与复合主键
主要分析三点: 一.数据表和Java类的映射 : 二.单一主键映射和主键的生成策略 : 三.复合主键的表映射 : 一.数据表和Java类的映射 Hibernate封装了数据库DDL语句,只需要将数据 ...
- Hibernate联合主键映射
1.联合主键的映射规则 1) 类中的每个主键属性都对应到数据表中的每个主键列. Hibernate要求具有联合主键的实体类实现Serializable接口,并且重写hashCode与equals方法, ...
- Hibernate征途(七)之复合主键映射和集合映射
把这两种映射放到一起说,是因为这两种映射不像前面的复用型映射.数量和方向型映射那么分类鲜明,所以放到了这个“其他”里面. 复合主键映射 在关系模型中,复合主键和其他的主键方式没有很大区别,但是反映到对 ...
- hibernate中基于主键映射1-1关联关系和基于外键映射1-1关联关系的不同
基于主键映射1-1关联关系和基于外键映射1-1关联关系的不同,主要区别是在配置映射文件上会有区别 两个持久化类为Manager和Department 1:基于主键映射1-1关联关系 1)使用其他持久化 ...
- (转)Hibernate框架基础——映射主键属性
http://blog.csdn.net/yerenyuan_pku/article/details/52740744 本文我们学习映射文件中的主键属性,废话不多说,直接开干. 我们首先在cn.itc ...
- Hibernate复合主键映射
目录: 1. 实现方式一:将复合主键对应的属性与实体其他普通属性放在一起 2. 实现方式二:将主键属性提取到一个主键类中,实体类只需包含主键类的一个引用 在日常开发中会遇到这样一种情况,数据库中的某张 ...
- Entity Framework 无法对没有主键的视图映射实体的解决办法
我们在使用Entity Framework的时候经常会把数据库中的某一个视图映射为EF的实体,但是如果数据库视图中的列没有包含表的主键列,EF会报出警告说视图没有主键,导致视图映射为实体失败,错误如下 ...
随机推荐
- (转)在.NET程序运行过程中,什么是堆,什么是栈?什么情况下会在堆(栈)上分配数据?它们有性能上的区别吗?“结构”对象可能分配在堆上吗?什么情况下会发生,有什么需要注意的吗?
转自:http://www.cnblogs.com/xiaoyao2011/archive/2011/09/09/2172427.html 在.NET程序运行过程中,什么是堆,什么是栈? 堆也就是托管 ...
- day33(sql)
操作数据库 增: create database 数据库名 character set utf8 删 drop database 数据库名称 改 alter database 数据库名称 charac ...
- php获取跳转后的真实链接
网站的跳转链接经常为本站链接加上一些参数来跳转,如何使用php获取跳转后的链接呢? php代码如下: <?php // echo get_redirect_url('http://www.osc ...
- PAT甲级 1128. N Queens Puzzle (20)
1128. N Queens Puzzle (20) 时间限制 300 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue The & ...
- A - Class Statistics
A - Class Statistics Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Subm ...
- poj1321 DFS
棋盘问题 Time Limit: 1000 MS Memory Limit: 10000 KB 64-bit integer IO format: %I64d , %I64u Java class n ...
- OS基础:动态链接库(二)
1.vc6.0新建工程MFC AppWizard[dll]工程 命名LptMfcDll1 2.在lptMfcDll1.h添加函数名声明 添加的代码: //lptAddBegin void lptMfc ...
- phpize增加php模块
phpize增加php模块 张映 发表于 2010-02-09 分类目录: php 一,phpize的好处 什么时候我们要用phpize呢?我们在安装php时: './configure' '--pr ...
- mooctest项目总结 【转载】
原文链接 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3 ...
- Azure DevOps Server 2019 (TFS)安装教程
概述 Azure DevOps Server 2019 (之前的名称为TFS),作为微软Azure DevOps 的企业私有(on-premises)服务器,是一个为开发团队提供软件协作开发管理的服务 ...