Hibernate框架学习之一(关系模型)

Hibernate是一种orm技术框架,处于面向对象和数据库的中间层次

一、概述

1. 作为面向对象的思考者,希望的最理想的情况是在使用对象的时候,最少的关注数据库

2. 对象与关系型数据库在领域概念上却又有着天然的不一致

(1)领域概念应对成对象是需要有行为的 (2) 对象的概念在数据的表中不是完全一样的

下面就总结一下对象的关系在数据库中的样子,同时引出Hibernate的几种表达关系注解的使用方式

@OneToOne @OneToMany @ManyToOne @ManyToMany

二、具体

1、对象之间的一对一关系

对象领域:一个对象指向另一个对象的指针

数据库领域: 一个表的外键关联另一个表的主键

我们使用@OneToOne的方式进行一对一关联

@Entity
@Table(name = "orders")
public class Order
{
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private int id;
	private String name;

	@OneToOne
	@JoinColumn(name = "productId")
	private Product product;
	public Order() {
		// TODO Auto-generated constructor stub
	}

	public Order(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "Order [id=" + id + ", name=" + name + "]";
	}
}

解释:@OneToOne 是关系的标记,@JoinColum是主动定义外键的名称,如果不定义,会默认搜索Product对应的表的名称默认定义为tablename_id

Product的定义

@Entity
@Table(name = "products")
public class Product {
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private int id;
	private String name;

	public Product(String name) {
		this.name = name;
	}

	public Product() {
		// TODO Auto-generated constructor stub
	}

	@Override
	public String toString() {
		return "Product [name=" + name + "]";
	}

}

在这种情况下,对应的数据库表是:

补充:

如果希望在面向对象的领域product也能找到order,就需要在Product类中保存一个指向Order的指针,如果还是用@OneToOne就会在product中额外加一个外键

为了避免数据库再加外键,如何实现呢? 使用mappedBy

//product指的是对方的product属性
	@OneToOne(mappedBy = "product")
	private Order order;

可见 mappedBy的含义是什么呢? 本质是级联处理的维护端是那一方。

关于级联处理理解,下面是对象的依赖关系:

A ---> B --->C

1. A是关系维护者

下面我们可以使用实例来证明一下:

	@Test
	public void testSaveOrder() {
		Order order = new Order("dfp");
		Product product = new Product("machine");
		order.setProduct(product);
		orderdao.save(order);
		System.out.println(order.toString());
	}

上面的代码,product被设置到了order中,当order被保存到数据库中的时候,是否会同步保存product呢?

如果需要同步保存produt需要将其cascade选项设置为CASCADE.ALL

@OneToOne(cascade = CascadeType.ALL)
	@JoinColumn(name = "productId")
	private Product product;

2. 对象之间多对一的关系

最简单的情况: 比如一个商品关联一个品牌

@Entity
@Table(name = "productItems")
public class ProductItem {
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private int id;
	private String name;

	@OneToOne
	@JoinColumn(name = "lableName")
	private Lable lable;

	public ProductItem() {
		// TODO Auto-generated constructor stub
	}
	public ProductItem(String name) {
		this.name = name;
	}

	public void setLable(Lable lable) {
		this.lable = lable;
	}
	@Override
	public String toString() {
		return "ProductItem [name=" + name + ", lable=" + lable + "]";
	}
}
@Entity
@Table(name = "lables")
public class Lable {
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private int id;
	private String name;

	public Lable(String name) {
		this.name = name;
	}
	public Lable() {
		// TODO Auto-generated constructor stub
	}
	@Override
	public String toString() {
		return "Lable [name=" + name + "]";
	}
}

3.  对象之间的一对多的关系(包含反向的多对一)

对象模型: ShoppingCard (1)---- product(n) (那么 ShoppingCard 对应 product 是1对多的关系product 对应 ShoppingCard 是多对一的关系)

数据库模型:

(1) 选取ShoppingCard和product的主键,建立起一个新表ShoppingCards_products

对应的代码如下:

@Entity
@Table(name = "shoppingCards")
public class ShoppingCard {
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private int id;

	public ShoppingCard() {
		// TODO Auto-generated constructor stub
	}
	@OneToMany(cascade = CascadeType.ALL)
	private List<Product> products = new ArrayList<Product>();

	public void addProduct(Product product){
		products.add(product);
	}

}
@Entity
@Table(name = "products")
public class Product {
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private int id;
	private String name;

	//product指的是对方的product属性
	@OneToOne(mappedBy = "product")
	private Order order;

	public Product(String name) {
		this.name = name;
	}

	public Product() {
		// TODO Auto-generated constructor stub
	}

	@Override
	public String toString() {
		return "Product [name=" + name + "]";
	}
}

(2) product的外键对应的是shoppingcard的主键

建立product的多对一的关联,同时建立外键

	@ManyToOne
	@JoinColumn(name = "shopppingcard")
	private ShoppingCard card;

建立数据库模型如下

四、多对多的关系

未完待续

作为多年开发的C++程序员,最近在看java的hibernate发现当你需要解决级联级联更新问题的时候,更多的就要思考生命周期的问题的问题了。

时间: 2024-07-30 15:51:21

Hibernate框架学习之一(关系模型)的相关文章

j2ee开发之hibernate框架学习笔记

hibernate框架技术重点学习笔记 1.针对不同的数据库,有不同的数据库实现类,使其符号对应的数据库? mysqlDaoImpl oracleDaoImpl ... ... 2.对象和表记录的转换存在着转换问题->orm,对象和关系的一种映射 3.框架:解决一种问题的方案集合! 4..配置文件 Xxx.cfg.xml  主配置文件 xxx.hbm.xml映射文件: 映射基础 普通属性 主键 集合属性 关联关系:一对多  多对一 多对多  一对一 继承结构 5.其他特性:数据库连接池  懒加载

hibernate 框架学习笔记---网上摘抄的一个非常好的例子

编写Spring+Hibernate框架下的应用,总是离不了编写一个通用的泛型GenericHibernateDao.查阅了网上不少的GenericHibernateDao实现,归纳整理为如下实现,供后续编码参考. 首先定义接口泛型DAO接口 GenericDao package com.th.huz; import java.io.Serializable;import java.util.Collection;import java.util.Iterator;import java.uti

二、框架学习 (一)Hibernate框架学习 (2)Hibernate概念和api使用

目录 1 实体类编写规则 2 hibernate主键生成策略 3 实体类操作 (1)crud操作 (2)实体类对象状态 4 hibernate的一级缓存 5 hibernate的事务操作 (1)事务代码规则写法 6 hibernate其他的api(查询) 正文 实体类编写规则 1 实体类里面属性是私有的 2 私有属性使用公开的set和get方法操作. 3 要求实体类有属性作为唯一值(一般使用id值) 4 实体类属性建议不使用基本数据类型,使用基本数据类型对应的包装类 (1)八个基本数据类型对应的

Hibernate框架学习(一)——入门

一.框架是什么 1.框架是用来提高开发效率的 2.封装好了一些功能,我们需要使用这些功能时,调用即可,不需要手动实现 3.框架可以理解成一个半成品的项目,只要懂得如何驾驭这些功能即可 二.hibernate框架是什么 三.hibernate 1.操作数据库的时候,可以以面向对象的方式来完成,不需要书写SQL语句 2.hibernate是一款orm框架 1)orm:object relating mapping.对象关系映射 2) 3)orm分4级 hibernate属于4级:完全面向对象操作数据

hibernate框架学习笔记1:搭建与测试

hibernate框架属于dao层,类似dbutils的作用,是一款ORM(对象关系映射)操作 使用hibernate框架好处是:操作数据库不需要写SQL语句,使用面向对象的方式完成 这里使用eclipse工具搭建: 官网下载:https://sourceforge.net/projects/hibernate/files/hibernate-orm/5.0.7.Final/ 下载.zip文件后解压: lib文件夹下的required文件夹内的jar包为必须包: 另外还需要MySQL的驱动包:

hibernate框架学习笔记2:配置文件详解

实体类: package domain; public class Customer { private Long cust_id; private String cust_name; private String cust_source; private String cust_industry; private String cust_level; private String cust_linkman; private String cust_phone; private String c

一级缓存 ---- Hibernate框架学习

叙:hibernate中有一个特色,即,hibernate的持久态能自动更新数据库,不需要手动设置更新操作代码,而持久态的这一特色所依据的便是hibernate的一级缓存技术.那么之前学过了hibernate的三态,现在学习一下一级缓存: hibernate的一级缓存 首先,要明白什么是缓存: 什么是缓存? 缓存:一种优化方式,将数据存储在本地,当使用到保存的数据时不必再向服务器或者终端进行请求数据的操作,直接读取本地数据即可. 然后现在了解一下hibernate的缓存: hibernate缓存

Hibernate框架学习(二)——api详解

一.Configuration对象 功能:配置加载类,用于加载主配置,orm元数据加载. 1 //1.创建,调用空参构造(还没有读配置文件) 2 Configuration conf=new Configuration(); 3 //2.读取指令配置文件=>空参加载方法,加载src下的hibernate.cfg.xml文件 4 conf.configure(); 5 6 //3.读取指定orm元数据(扩展),如果主配置中已经引入映射配置,不需要手动加载 7 //conf.addResource(

hibernate框架学习笔记8:一对多关系案例

两个实体类:客户与联系人,一个客户可以有多个联系人 客户类: package domain; import java.util.HashSet; import java.util.Set; //客户实体 public class Customer { private Long cust_id; private String cust_name; private String cust_source; private String cust_industry; private String cus