23_Hibernate实体关系映射

来源:互联网 发布:淘宝二手闲置论坛 编辑:程序博客网 时间:2024/05/10 16:33

23.1 单边的一对多关系:电子邮件管理

一对多是指一方有多个多方,多方却没有一方

23.1.1 UML,数据库关系

Person.java中有

id

name

List<Email>

Email.java中有

id

email

一个person有多个email,而email中没有person

对应的表中

tb_person

id

name

tb_email

id

email

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 本章小结