23_Hibernate实体关系映射
来源:互联网 发布:淘宝二手闲置论坛 编辑:程序博客网 时间:2024/05/10 16:33
23.1 单边的一对多关系:电子邮件管理
一对多是指一方有多个多方,多方却没有一方
23.1.1 UML,数据库关系
Person.java中有
id
name
List<Email>
Email.java中有
id
一个person有多个email,而email中没有person
对应的表中
tb_person
id
name
tb_email
id
person_id
若person中有email外键,则一个person的email外键要有多个id,不现实
而email中有person外键,一个email只需要有一个person的外键即可
--------------------------------------------------------------------------------------------------------
总结下
一个person有多个email,则
person类中有多个email,而
person表中没有email外键,
email表中有person外键
代码:
Person.java
package com.uikoo9.model;import java.util.ArrayList;import java.util.List;import javax.persistence.*;@Entity//实体类@Table(name="tb_person")//对应的表名public class Person {@Id//声明主键@GeneratedValue(strategy = GenerationType.AUTO)//声明主键生成策略private Integer id;//主键@Column(name="name")//声明普通属性,可以省略private String name;//名字@OneToMany(//一个Person中有多个Email,但是Email中却没有Personfetch = FetchType.EAGER,//即时加载,相对应的还有延时加载targetEntity = Email.class,//指定类,可以省去cascade = {//级联操作,当操作Person的时候对相应Email的操作CascadeType.PERSIST,//保存CascadeType.REMOVE,//删除CascadeType.MERGE,//修改CascadeType.REFRESH//刷新//CascadeType.ALL//以上所有操作的集合})@JoinColumns(value={//email表中的外键声明@JoinColumn(name="person_id",//外键名称为person_idreferencedColumnName="id"//关联person的id属性)})@OrderBy(value="email desc")//list中的Email通过email属性倒序排列private List<Email> emails = new ArrayList<Email>();//email集合//getters and setters-------------------------------------------public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public List<Email> getEmails() {return emails;}public void setEmails(List<Email> emails) {this.emails = emails;}}
Email.java
package com.uikoo9.model;import javax.persistence.*;@Entity@Table(name="tb_email")public class Email {@Id@GeneratedValue(strategy = GenerationType.AUTO)private Integer id;//主键,自动生成private String email;//普通属性,配置省去//getters and setterspublic Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}}
23.1.2 @配置Person类
23.1.3 @配置Email类
见上
23.1.4 配置到hibernate.cfg.xml中
<?xml version='1.0' encoding='UTF-8'?><!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"><!-- Generated by MyEclipse Hibernate Tools. --><hibernate-configuration> <session-factory> <!-- jdbc for firebird --> <property name="connection.driver_class">org.firebirdsql.jdbc.FBDriver</property> <property name="connection.url">jdbc:firebirdsql:localhost:E:\Documents\FireBird\test.fdb</property> <property name="connection.username">uikoo9</property> <property name="connection.password">uikoo7</property> <!-- dialect for firebird --> <property name="dialect">org.hibernate.dialect.FirebirdDialect</property> <!-- 打印SQL --> <property name="show_sql">true</property> <!-- 创建表 --> <property name="hbm2ddl.auto">update</property> <!-- 线程 --> <property name="current_session_context_class">thread</property><property name="javax.persistence.validation.mode">none</property> <!-- 映射实体类 --><mapping class="com.uikoo9.model.Person"/><mapping class="com.uikoo9.model.Email"/> </session-factory></hibernate-configuration>
23.1.5 运行代码
23.1.6 延迟加载与即时加载
即时加载(Eagar Fetching),查询Person的时候自动加载相关的Email
延迟加载(Lazy Fetching),只有在需要的时候才查询Email
23.1.7 延迟加载异常
只有在person.getEmails()的时候才会加载需要的Email,
但是如果调用的时候session关闭了,那么就会抛出异常,
解决的办法:
在session关闭前调用一次上面的方法
23.1.8 XML配置Person类
23.1.9 XML配置email类
23.1.10 加载XML配置的实体
23.1.11 配置String类型的实体
JPA要求实体必须为POJO,而不能是String
XML配置的话实体类可以为String
23.2 单边的多对一关系:论文管理
多方有一方的引用,而一方没有多方的引用
----------------------------------------------------------------
总结下
一对多是一中有多个多,而
多对一是多有一的属性
23.2.1 UML,数据库关系
23.2.2 @配置Type类
Type.java
package com.uikoo9.model;import javax.persistence.*;@Entity@Table(name="tb_type")public class Type {@Id@GeneratedValue(strategy = GenerationType.AUTO)private Integer id;@Column(unique = true)private String name;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}}
23.2.3 @配置Article类
Article.java
package com.uikoo9.model;import javax.persistence.*;@Entity@Table(name="tb_article")public class Article {@Id@GeneratedValue(strategy = GenerationType.AUTO)private Integer id;private String name;@Column(columnDefinition = "text")private String content;@ManyToOne(cascade = {CascadeType.PERSIST},fetch = FetchType.EAGER)@JoinColumn(name = "type_id")private Type type;//getters and setterspublic Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}public Type getType() {return type;}public void setType(Type type) {this.type = type;}}
23.2.4 配置到hibernate.cfg.xml
23.2.5 运行代码
23.2.6 XML配置Type类
23.2.7 XML配置Artile类
23.3 双边的多对一,一对多关系:学生属性
双边的多对一是指多和一都有相互的引用
双边的一对多也是,
并不是多对多
23.3.1 UML,数据库关系
23.3.2 @配置Clazz类
Clazz.java
package com.uikoo9.model;import java.util.ArrayList;import java.util.List;import javax.persistence.*;@Entity@Table(name="tb_clazz")public class Clazz {@Id@GeneratedValue(strategy = GenerationType.AUTO)private Integer id;private String name;@OneToMany(mappedBy = "clazz")private List<Student> students = new ArrayList<Student>();public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public List<Student> getStudents() {return students;}public void setStudents(List<Student> students) {this.students = students;}}
23.3.3 @配置Student类
Student.java
package com.uikoo9.model;import javax.persistence.*;@Entity@Table(name="tb_student")public class Student {@Id@GeneratedValue(strategy = GenerationType.AUTO)private Integer id;private String name;private String sex;@ManyToOne(cascade = {CascadeType.PERSIST},fetch = FetchType.EAGER)@JoinColumn(name="class_id")private Clazz clazz;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public Clazz getClazz() {return clazz;}public void setClazz(Clazz clazz) {this.clazz = clazz;}}
23.3.4 配置到hibernate.cfg.xml
23.3.5 运行代码
23.3.6 XML配置clazz类
23.3.7 XML配置Student类
23.4 单边的多对多关系:论坛文章管理
23.4.1 UML,数据库关系
23.4.2 @配置Tag类
23.4.3 @配置Post类
23.4.4 运行代码
23.4.5 XML配置Tag类
23.4.6 XML配置Post类
23.5 双边的多对多关系
23.5.1 @配置Tag类
23.5.2 XML配置Tag类
23.6 单边的一对一关系:舰船管理
23.6.1 UML,数据库关系
23.6.2 @配置Ship类
23.6.3 @配置Sailor类
23.6.4 运行代码
23.6.5 XML配置Ship类
23.6.6 XML配置sailor类
23.7 双边的一对一
23.7.1 @配置Ship类
23.7.2 XML配置Ship类
23.8 主键相同的一对一关系:客户地址管理
23.8.1 UML,数据库关系
23.8.2 @配置Customer类
使用@PrimaryKeyJoinColumn
23.8.3 @配置Address类
同上
23.8.4 运行代码
注意,需要手动设置两者的id相同
23.8.5 XML配置Customer类
23.8.6 XML配置Address类
23.9 Map映射
23.9.1 @MapKey配置Map
使用@Mapkey
23.9.2 XML配置Map
23.10 本章小结
- 23_Hibernate实体关系映射
- 22_Hibernate实体映射
- 实体关系映射
- 数据库实体关系映射
- JPA实体映射关系
- JPA实体关系映射
- Hibernate实体关系映射
- Hibernate实体关系映射
- hibernate实体关系映射
- hibernate实体关系映射
- Hibernate实体关系映射
- 映射实体关联关系
- 实体关系映射
- O/R 实体关系映射
- O/R 实体关系映射
- 实体关系映射(四)
- hibernate 实体关系映射笔记
- 实体关系映射(四)
- 软件测试面试题及解析(九)
- UVA 657 - The die is cast
- Qt_designer入门教程
- JSTL与Struts的结合(十)
- liunx如何查看是否安装包
- 23_Hibernate实体关系映射
- Ubuntu 11.10无法登录问题
- UVA 297 - Quadtrees
- JSTL与Struts的结合(十一)
- 磁盘空间不足导致mysql报错
- 谱聚类
- 国际奥委会正式收回阿姆斯特朗悉尼奥运会铜牌
- dhcp
- httpClient中文帮助文档,最新官方翻译版