一步步学习Hibernate框架(三):采用jpa实现一对多关联映射(一)

JPA(Java Persistence API)是Sun官方提出的一种Java持久化规范。为Java开发人员提供了一种对象/关系映射工具,管理Java应用中的关系数据。JPA的总体思想和现有Hibernate、TopLink等ORM框架大体一致。总的来说,JPA包括以下3方面的技术:

第一:ORM映射元数据

JPA支持XML和JDK 注释(也可译作注解)两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中。

第二:Java持久化API

用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有的事情,开发者可以从繁琐的JDBC和SQL代码中解脱出来。

第三:查询语言

这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。

现在就用第一种技术来实现一对多的映射,对应到mysql中。一对多的处理有两种处理方式,第一种是映射成第三张表,第二种是映射成主外键关系。

需要引用的jar包除了hibernate的jar包,还有:

第一种:以一的主键作为多的外键

Group.java

package com.tgb.zhudan;

import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name="t_group")
public class Group {

	private int id;

	private String name;

	private List<User> user;

	@Id
	@GeneratedValue
	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;
	}
	/*@OneToMany*/
	@OneToMany(cascade = CascadeType.ALL, mappedBy = "id")//指向多的那方的pojo的关联外键字段
	public List<User> getUser() {
		return user;
	}

	public void setUser(List<User> user) {
		this.user = user;
	}
}

User.java

package com.tgb.zhudan;

import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name="t_group")
public class Group {

	private int id;

	private String name;

	private List<User> user;

	@Id
	@GeneratedValue
	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;
	}
	/*@OneToMany*/
	@OneToMany(cascade = CascadeType.ALL, mappedBy = "id")//指向多的那方的pojo的关联外键字段
	public List<User> getUser() {
		return user;
	}

	public void setUser(List<User> user) {
		this.user = user;
	}
}

hibernate.cfg.xml

<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
	<session-factory>
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_jpa_one2many</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">123456</property>
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		<property name="hibernate.show_sql">true</property>

		<mapping class="com.tgb.zhudan.Group"/>
		<mapping class="com.tgb.zhudan.User"/>
	</session-factory>
</hibernate-configuration>

ExportDB:

package com.tgb.zhudan;

import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;

/**
 * 将hbm生成ddl
 * @author Administrator
 *
 */
public class ExportDB {

	public static void main(String[] args) {

		//默认读取hibernate.cfg.xml文件
		Configuration cfg = new AnnotationConfiguration().configure();

		SchemaExport export = new SchemaExport(cfg);
		export.create(true, true);
	}
}

生成的数据库表如下:

t_group表:

t_user表:

总结:从上面的两张数据表可以看到一端(t_group)的id作为了外键存在了多端(t_user),生成一个叫group_id的字段作为一端(t_group)的在多端(t_user)的外键。

如果我想让这种一对多关系的实体在数据库中的体现是第三种表而不是外键关系,那么我又应该怎么写jpa注解呢?下篇博客我们再说。

时间: 2024-11-07 07:29:51

一步步学习Hibernate框架(三):采用jpa实现一对多关联映射(一)的相关文章

一步步学习Hibernate框架(四):采用jpa实现一对多关联映射(二)

上篇博客已经采用jpa注解来实现了一对多关联映射,将这种关联映射以外键的形式处理,现在来看看怎么以第三张表的形式处理.采用jpa注解来映射数据库要使用的jar包见上篇博客: 一步步学习Hibernate框架(三):采用jpa实现一对多关联映射(一) 现在看第二种方式:以第三张表的关系来体现 Group.java package com.tgb.zhudan; import java.util.List; import javax.persistence.CascadeType; import j

【SSH之旅】一步步学习Hibernate框架(一):关于持久化

在不引用不论什么框架下,我们会通过平庸的代码不停的对数据库进行操作,产生了非常多冗余的可是又有规律的底层代码,这样频繁的操作数据库和大量的底层代码的反复书写极大的浪费了程序人员的书写.就在这样一种情况下,Hibernate框架应运而生了. 事实上Hibernate封装的就是Model模型中的model,封装的这部分又叫持久层.在这层中对对象进行加入.删除.更新.查询等操作就叫做持久化. 持久化的对象有三种状态:Transient Objects.Persist Objects.Detached

【SSH之旅】一步步学习Hibernate框架(二):一对一关联映射中的主键关联

一对一的映射在对象模型中是经常见到的,主要是将对象模型转换为关系模型就必须在映射文件中进行配置,重点是<one-to-one>标签的使用,有两种方式,第一是主键关联,第二是唯一外键关联,现在先来看第一种方式. 一对一的关联映射中的主键关联,就是说两个对象具有相同的主键值,以表明它们之间的一一对应的关系,数据库表不会有额外的字段来维护它们之间的关系,仅仅是通过表的主键来关联. 上图的Person类和IdCard类之间是一一对应关系,一个人就只能有一个身份证,一个身份证只能对应一个人,那么身份证的

【SSH系列】Hibernate映射 -- 一对多关联映射

    映射原理       一对多关联映射和多对一关联映射的映射原理是一样一样的,所以说嘛,知识都是相通的,一通百通,为什么说一对多关联映射和多对一关联映射是一样的呢?因为她们都是在多的一端加入一个外键,指向一的一段,关联关系都是在多的一端进行维护,只是我们在写映射的时候发生了变化.       一对多和多对一的映射原理是一样的,但是她们之间也存在着小小的区别,毕竟世界上没有两片完全相同的叶子,她们之间的区别就是维护的关系不同,我们先来看多对一,多端维护一端的关系,在加载多端的时候,可以将一端

【SSH进阶之路】Hibernate映射——一对多关联映射(七)

上上篇博文[SSH进阶之路]Hibernate映射--一对一单向关联映射(五),我们介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身份证端加载人得信息. 上篇博文[SSH进阶之路]Hibernate映射--一对一双向关联映射(六),双向关联映射解决了单向关联映射只能从一端加载信息的缺陷,当然,双向关联映射并不影响存储,只影响加载.下面我们开始今天的内容: 一对多关联映射 映射原理 一对多关联映射和多对一关联映射的映射原理是一致的,

hibernate之关于使用连接表实现一对多关联映射

[Hibernate]之关于使用连接表实现一对多关联映射 基于中间表实现的一对多的关联映射,还是比较常见的. Person(人)和Group(组) Annotations配置 @Entity @Table(name="t_group") publicclass Group {     private Integer id;     private String name;     private Set<Person> persons=newHashSet<Perso

8、Hibernate框架(ORM详解、主文件配置、映射文件配置)

开发回顾: SSH框架: Struts框架, 基于mvc模式的应用层框架技术! Hibernate, 基于持久层的框架(数据访问层使用)! Spring, 创建对象处理对象的依赖关系以及框架整合! Dao代码,如何编写? - 操作XML数据 - 使用Jdbc技术 原始的jdbc操作, Connection/Statement/ResultSet 自定义一个持久层框架, 封装了dao的通用方法 DbUtils组件, 轻量级的dao的组件: Hibernate技术 [hibernate最终执行的也是

hibernate框架(三)持久化类&amp;主键生成策略

一 持久化类的一个编写规则持久化:将内存中的一个对象持久化到数据库中的过程持久化类:一个Java对象与数据库的表建立了映射关系,那么这个类在hibernate中称为持久化类可以这么理解:持久化类=Java类+映射文件 持久化类的编写规则1 对持久化类提供一个无参的构造方法2 属性需要私有,对私有属性提供get和set方法3 对持久化类提供一个唯一标识Oid与数据库中主键对应4 持久化类中属性尽量使用包装类类型5 持久化类不要使用final进行修饰 二 主键生成策略先介绍一下主键的分类:自然主键和

Linux学习总结(三十三)lamp之httpd关联php

一.httpd 关联php httpd主配置文件/usr/local/apache2.4/conf/httpd.confvim /usr/local/apache2.4/conf/httpd.conf//修改以下4个地方1打开虚拟主机搜索ServerName,去掉前面#号 紧接着往下找到Require all denied,修改为granted ,意思是将拒绝请求改为允许.3 搜索管检测AddType 找到AddType application/x-gzip .gz .tgz 在其下面增加一行