在多对多的关联关系中,可拆分为两个一对多的关联关系,即在两个表中间增加一个关联表,记录这两个表之间的关联关系。若抛开关联表,则原2个表之间看不出任何的关系。
以为考试类别和考试科目为例,详细讲解在添加关联表的情况下两个表之间的hibernate设置。 考试类别表:exam_sort_enum id:integer name:string 考试科目表:subject id:integer name:string 考试类别科目关联表 exam_sort_enum_id:integer 对应考试类别表的id subject_id:integer 对应考试科目表的id
ExamSortEnum.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping> <class name="model.ExamSortEnum" table="EXAM_SORT_ENUM" lazy="false" > <id name="id" type="integer" column="ID" length="22" > <generator class="increment" /> </id>
<property name="name" type="string" column="NAME" length="255" /> <set name="subject" table="EXAM_SORT_ENUM_SUBJECT" lazy="true" cascade="save-update"> <key column="exam_sort_enum_id"/> <many-to-many column="subject_id" class="model.Subject"/> </set> </class> </hibernate-mapping>
ExamSortEnum.java
package model;
import java.io.Serializable; import java.util.HashSet; import java.util.Set;
public class ExamSortEnum implements Serializable{
private static final long serialVersionUID = <chmetcnv w:st="on" unitname="l" sourcevalue="1" hasspace="False" negative="False" numbertype="1" tcsc="0">1L</chmetcnv>; private Integer id; private String name; private Set subject = new HashSet();
public ExamSortEnum(){} public ExamSortEnum(Integer id){ setId(id); }
public void setSubject(Set subject){ this.subject = subject; }
public Set getSubject(){ return this.subject; }
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; } }
关于映射文件:
映射文件要设置set, name=subject 为ExamSortEnum.java文件中定义的Set对象,存储多个Subject类型的容器。 table="EXAM_SORT_ENUM_SUBJECT" 为对应的中间表的表名,由于两个业务表之间不能直接打交道,只能通过中间表来进行关联。 lazy="true" 延迟加载 cascade="save-update" 级联保存更新,若设置为all,delete,all-delete-orphans,则在删除一个ExamSortEnum对象时,关联的Subject对象也被删除,而此关联的subject对象可能被其他的为ExamSortEnum对象所引用。 <key column="exam_sort_enum_id"/> 指定中间表中参照为Exam_Sort_Enum表的外键为exam_sort_enum_id <many-to-many> column="subject_id" Exam_Sort_Enum表参照Subject表的外键为subject_id,即Exam_Sort_Enum表通过subject_id与Subject表关联 class="model.Subject" 指定set中name=subject中存放的是model.Subject对象。
Subject.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping> <class name="model.Subject" table="SUBJECT" lazy="false" > <id name="id" type="integer" column="ID" length="22" > <generator class="increment" /> </id>
<property name="name" type="string" column="NAME" length="200" />
<set name="examSortEnum" table="EXAM_SORT_ENUM_SUBJECT" lazy="true" inverse="true" cascade="save-update"> <key column="subject_id"/> <many-to-many column="exam_sort_enum_id" class="model.ExamSortEnum"/> </set> </class> </hibernate-mapping>
Subject.java
package model;
import java.io.Serializable; import java.util.HashSet; import java.util.Set;
public class Subject implements Serializable{
private static final long serialVersionUID = <chmetcnv w:st="on" unitname="l" sourcevalue="1" hasspace="False" negative="False" numbertype="1" tcsc="0">1L</chmetcnv>; private Integer id; private String name; private Set examSortEnum = new HashSet();
public Subject(){} public Subject(Integer id){ setId(id); }
public void setExamSortEnum(Set examSortEnum){ this.examSortEnum = examSortEnum; } public Set getExamSortEnum(){ return this.examSortEnum; }
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; } }
关于映射文件: 内容与ExamSortEnum.hbm.xml差不多,只是多了一个inverse="true",告诉hibernate控制权不在此处,两个映射文件只能设置一个。
测试类: package model;
import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration;
public class ExamSortEnumTest { public static SessionFactory sf ;
static{ try{ Configuration cfg = new Configuration().configure(); sf = cfg.buildSessionFactory(); }catch(Exception e){ e.printStackTrace(); } }
public void insert1(){ Session sess = sf.openSession(); Transaction tx = sess.beginTransaction();
Subject sa = new Subject(); sa.setName("A1");
Subject sb = new Subject(); sb.setName("B1");
Subject sc = new Subject(); sc.setName("C1");
ExamSortEnum esea = new ExamSortEnum(); esea.setName("A"); esea.getSubject().add(sa); esea.getSubject().add(sc);
ExamSortEnum eseb = new ExamSortEnum(); eseb.setName("B"); eseb.getSubject().add(sb); eseb.getSubject().add(sc);
sess.save(esea); sess.save(eseb);
tx.commit(); sess.close();
}
public static void main(String[] args){ ExamSortEnumTest et = new ExamSortEnumTest(); et.insert1(); } }
执行后的结果: 考试类别表:exam_sort_enum id name <chmetcnv w:st="on" unitname="a" sourcevalue="3" hasspace="True" negative="False" numbertype="1" tcsc="0">3 A</chmetcnv> 4 B
考试科目表:subject id name <chmetcnv w:st="on" unitname="C" sourcevalue="3" hasspace="True" negative="False" numbertype="1" tcsc="0">3 C</chmetcnv>1 <chmetcnv w:st="on" unitname="a" sourcevalue="4" hasspace="True" negative="False" numbertype="1" tcsc="0">4 A</chmetcnv>1 5 B1
考试类别科目关联表 exam_sort_enum_id subject_id 3 3 3 4 4 3 4 5
|
相关推荐
hibernate入门,内含配置文件,以及基本的增删改查操作。
本次文件包括struct配置文件,spring配置文件,hibernate配置文件。均为最新版本配置,绝对能用。本附件将hibernate的配置文件,融入spring文件中,并且将action和bean配置分开管理,更易理解。欢迎下载!
高级Hibernate4开发技术:ORM思想,hibernate介绍,hibernate.cfg.xml配置,hbm.xml映射文件详解,主键生成策略使用,PO对象状态及状态的转换分析、一级缓存,Hibernate数据检索技术,Hibernate高级映射技术,...
高级Hibernate4开发技术:ORM思想,hibernate介绍,hibernate.cfg.xml配置,hbm.xml映射文件详解,主键生成策略使用,PO对象状态及状态的转换分析、一级缓存,Hibernate数据检索技术,Hibernate高级映射技术,...
关于SpringMVC+Hibernate5项目配置,方便初学者使用,基本配置可以参看项目中的配置文件!
Hibernate的配置文件,包含了连接持久层与映射文件所需的基本信息,其配置文件有两种格式,具 体如下: ● 一种是properties 属性文件格式的配置文件,它使用键值对的形式存放信息,默认文件名称 为 hibernate....
配置文件的基本结构如下: <?xml version="1.0" encoding='UTF-8'?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" ...
在Hibernate的配置文件中,我们可以使用元素来设置数据库连接的各种属性,例如驱动程序的类名、连接URL、用户名、密码等。以SQL Server为例,我们可以使用以下配置: <property name="connection.driver_class">...
本文件为一个基本的项目配置,包括springmvc的基本配置,数据库连接池(c3p0)、事务管理、缓存、拦截器的配置。部分采用xml配置,部分采用注解。
正如其名,Configuration 类负责管理Hibernate 的配置信息。...这些属性在hibernate配置文件(hibernate.cfg.xml 或hibernate.properties)中加以设 定(参见前面“Hibernate配置”中的示例配置文件内容)。
这是hibernate开发必备的jar包,hibernate配置文件的基本配置以及一份log4j.properties的文件,防止出现日志记录相关的错误!
2.在项目中创建 Hibernate 配置文件 3.如何使用自定义的 Session Factory 4.从 Database Explorer 的表定义中生成 Java 类和 Hibernate 数据库映射文件 (.hbm) 5.使用 HQL 编辑器 6.创建使用 Hibernate 的小测试应用...
(一)实验目的 1、 掌握 Hibernate 开发环境搭建的基本步骤; 2、 观察持久化类与数据库表的映射关系,观察相应的 ...3、 观察 Hibernate 配置文件(hibernate.cfg.xml)中的主要元素及属性配置,并能够做简单应用。
Hibernate的基本配置,以及个配置文件中的每个标签的说明。
3.2 Hibernate配置 3.3 日志配置 3.4 第一段代码 3.5 代码初解 第4章 Hibernate基础 4.1 Hibernate基础语义 4.2 基础配置 4.3 Hibernate O/R映射 4.4 数据关联 4.5 Hibernate数据检索 4.6 HQL实用技术 ...
hibernate开发所需的所有jar包:包含hibernate基本jar包 annotation所需jar包 slf4j和lof4j的jar包 以及相关的配置文件
1、进一步掌握 Hibernate 应用的开发方法,理解 Hibernate 配置文件中主要元素 的作用,会开发持久化类,并进行相应的 Hibernate 映射文件配置; 2、学习并掌握 Hibernate 框架的常用 API,掌握利用 Hibernate 基本 ...
在Hibernate中使用注解,...(3)在Hibernate主配置文件中无需指定映射文件了,但需要指定注解的实体类。(springboot这一步也省了) 注解的具体文档在javax.persistence包下的注解类型总结Annotation Type Summry中。
掌握Hibernate的基本功能和基本用法 通过Hibernate将一个Java对象插入到数据库表中 ...(5) 可以利用Hibernate框架根据配置和类及映射文件生成数据库表结构,反过来,也可以根据数据库表结构生成持久化类和映射文件。
XML配置文件 3.8. J2EE应用程序服务器的集成 3.8.1. 事务策略配置 3.8.2. JNDI绑定的SessionFactory 3.8.3. 在JTA环境下使用Current Session context (当前session上下文)管理 3.8.4. JMX部署 4. 持久化类...