Hibernate从入门到精通(6)- 双向 多对多
来源:互联网 发布:通道网络花店 编辑:程序博客网 时间:2024/05/29 17:03
使用学生-教师进行测试:
如下图:
在Hibernate多对多关系中,数据库存数据多添加一张关系表,用来维持两个实体之间的关系。
XML配置文件
1.添加需要使用的jar文件
1.1数据库驱动包 ojdbc.jar
1.2Hibernate文件中的lib文件夹中的所有jar文件
2.创建hibernate.cfg.xml文件(*注意不要写Session factory name)
hibernate.cfg.xml:
<?xml version="1.0" encoding="UTF-8"?><!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"> oracle.jdbc.driver.OracleDriver</property> <property name="hibernate.connection.password"> xukai</property> <property name="hibernate.connection.url"> jdbc:oracle:thin:@10.25.112.21:1521:orcl</property> <property name="hibernate.connection.username"> xukai</property> <property name="hibernate.dialect"> org.hibernate.dialect.Oracle10gDialect</property> <!-- 创建表 --> <property name="hibernate.hbm2ddl.auto">update</property> <!-- 控制台输出SQL语句 --> <property name="show_sql">true</property> <!-- 输出语句格式化 --> <property name="format_sql">true</property> </session-factory></hibernate-configuration>
3.创建实体类,实现Serializable接口
package com.edu.entity;import java.io.Serializable;import java.util.HashSet;import java.util.Set;/** * @author xukai * 2015年11月22日下午8:29:15 */public class StudentInfo implements Serializable {private static final long serialVersionUID = 1L;private Integer stuId;private String stuName;private String sex;private Set<TeacherInfo> teas = new HashSet<>();//getter setter}
package com.edu.entity;import java.io.Serializable;import java.util.HashSet;import java.util.Set;/** * @author xukai * 2015年11月22日下午8:29:45 */public class TeacherInfo implements Serializable {private static final long serialVersionUID = 1L;private Integer teaId;private String teaName;private String sex;private Set<StudentInfo> stus = new HashSet<>();<span style="white-space:pre"></span>//getter setter}
4.创建hibernate mapping xml file
StudentInfo.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"><!-- Generated 2015-11-22 20:33:48 by Hibernate Tools 3.4.0.CR1 --><hibernate-mapping> <class name="com.edu.entity.StudentInfo" table="STUDENTINFO_TEST3"> <id name="stuId" type="java.lang.Integer"> <column name="STU_ID" /> <generator class="assigned" /> </id> <property name="stuName" type="java.lang.String"> <column name="STU_NAME" /> </property> <property name="sex" type="java.lang.String"> <column name="SEX" /> </property> <set name="teas" table="S_T_R_TEST3" inverse="true" lazy="true"> <key> <column name="R_STU_ID" /> </key> <many-to-many class="com.edu.entity.TeacherInfo" column="R_TEA_ID"/> <!-- 这里注意column一定要添加,还有实体类 --> </set> </class></hibernate-mapping>TeacherInfo.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"><!-- Generated 2015-11-22 20:33:48 by Hibernate Tools 3.4.0.CR1 --><hibernate-mapping> <class name="com.edu.entity.TeacherInfo" table="TEACHERINFO_TEST3"> <id name="teaId" type="java.lang.Integer"> <column name="TEA_ID" /> <generator class="assigned" /> </id> <property name="teaName" type="java.lang.String"> <column name="TEA_NAME" /> </property> <property name="sex" type="java.lang.String"> <column name="SEX" /> </property> <set name="stus" table="S_T_R_TEST3" inverse="false" lazy="true"> <key> <column name="R_TEA_ID" /> </key> <!-- 这里注意column一定要添加 --> <many-to-many class="com.edu.entity.StudentInfo" column="R_STU_ID"/> </set> </class></hibernate-mapping>
(*注:我测试的时候忘记添加column了,一样测试通过了,但是数据库关系表中多了一条字段,elt
create table S_T_R_TEST3 ( S_STU_ID number(10,0) not null, elt number(10,0) not null, R_TEA_ID number(10,0) not null, primary key (R_TEA_ID, elt) ))
5.在hibernate.cfg.xml中添加映射关系
<span style="white-space:pre"></span><!-- 关联映射文件 --> <mapping resource="com/edu/entity/StudentInfo.hbm.xml"/> <mapping resource="com/edu/entity/TeacherInfo.hbm.xml"/>
package config;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.boot.registry.StandardServiceRegistryBuilder;import org.hibernate.cfg.Configuration;import org.hibernate.service.ServiceRegistry;import org.junit.After;import org.junit.Before;import org.junit.Ignore;import org.junit.Test;import com.edu.entity.StudentInfo;import com.edu.entity.TeacherInfo;/** * @author xukai 2015年11月22日下午8:44:57 */public class TestConfig {private static SessionFactory factory;private static Session session;/** * 读取配置文件信息 */static {Configuration config = new Configuration().configure();ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(config.getProperties()).build();factory = config.buildSessionFactory(serviceRegistry);}@Beforepublic void init(){session = factory.openSession();}@Ignore@Testpublic void testConfig(){}/** * 进行事务操作 */@Test public void testSave(){//保存教师和学生//开启事务Transaction transaction = session.beginTransaction();StudentInfo student = new StudentInfo();student.setStuId(9);student.setStuName("学生1");student.setSex("男");TeacherInfo teacher = new TeacherInfo();teacher.setTeaId(10);teacher.setTeaName("教师2");teacher.setSex("女");/** * 以下两句至少有一句 *///student.getTeas().add(teacher);teacher.getStus().add(student);session.save(teacher);session.save(student);transaction.commit();//提交事务}/** * 查询 */@Ignore@Testpublic void testGet(){StudentInfo student = (StudentInfo) session.get(StudentInfo.class, 1);System.out.println(student);}@Afterpublic void after(){//关闭if(session != null && session.isOpen()){session.close();}}}
注解(Annotation)
实体类:StudentInfo:
package com.edu.entity;import java.io.Serializable;import java.util.HashSet;import java.util.Set;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.Id;import javax.persistence.ManyToMany;import javax.persistence.Table;/** * @author xukai * 2015年11月23日下午8:55:19 */@Entity@Table(name="STUDENT_INFO_TEST4")public class StudentInfo implements Serializable {private static final long serialVersionUID = 1L;@Id@Column(name="stu_id")private Integer stuId;@Column(name="stu_name")private String stuName;@Column(name="sex")private String sex;//关系由对方维护@ManyToMany(targetEntity=TeacherInfo.class,mappedBy="stus")private Set<TeacherInfo> teas = new HashSet<>();<span style="white-space:pre"></span>//getter setter}
TeacherInfo:
package com.edu.entity;import java.io.Serializable;import java.util.HashSet;import java.util.Set;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.Id;import javax.persistence.JoinColumn;import javax.persistence.JoinTable;import javax.persistence.ManyToMany;import javax.persistence.Table;/** * @author xukai * 2015年11月23日下午8:54:29 */@Entity()@Table(name="TEACHER_INFO_TEST4")public class TeacherInfo implements Serializable {private static final long serialVersionUID = 1L;@Id@Column(name="tea_id")private Integer teaId;@Column(name="tea_name")private String teaName;@Column(name="sex")private String sex;@ManyToMany(targetEntity=StudentInfo.class)@JoinTable(name="R_S_T_TEST4",joinColumns={@JoinColumn(name="R_TEA_ID")},inverseJoinColumns={@JoinColumn(name="R_STU_ID")})private Set<StudentInfo> stus = new HashSet<>();}
hibernate.cfg.xml中关系映射改为:
<span style="white-space:pre"></span><mapping class="com.edu.entity.StudentInfo"/> <mapping class="com.edu.entity.TeacherInfo"/>上面的那个测试类,依然可以通过。下面为测试截图:
exception:
org.hibernate.AnnotationException: No identifier specified for entity.
在对Entity进行对象关系映射的时候忘记加上主键@Id了。这个错是hibernate的 annotation报的错,所以肯定是对象上加的注解有问题。
1 0
- Hibernate从入门到精通(6)- 双向 多对多
- Hibernate从入门到精通(十一)多对多双向关联映射
- Hibernate从入门到精通(十一)多对多双向关联映射
- Hibernate从入门到精通(5)- 双向 一对多
- Hibernate从入门到精通(九)一对多双向关联映射
- Hibernate从入门到精通(九)一对多双向关联映射
- Hibernate从入门到精通(十)多对多单向关联映射
- Hibernate从入门到精通(4)- 单向 一对多 多对一
- Hibernate从入门到精通(十)多对多单向关联映射
- Hibernate从入门到精通(七)多对一单向关联映射
- Hibernate从入门到精通(七)多对一单向关联映射 .
- Hibernate从入门到精通(七)多对一单向关联映射
- 【Hibernate】从入门到精通(七)关联映射之多对多映射
- Hibernate从入门到精通(六)一对一双向关联映射
- Hibernate从入门到精通(六)一对一双向关联映射 .
- Hibernate从入门到精通(六)一对一双向关联映射
- Hibernate从入门到精通(1)
- Hibernate入门到精通-关系映射多对一
- Gradle入门系列(5):创建多项目构建
- 对象与指针的转换
- java匿名内部类
- Java基础——关键字
- (十)洞悉linux下的Netfilter&iptables:网络地址转换原理之SNAT
- Hibernate从入门到精通(6)- 双向 多对多
- 【Hibernate】hibernate的二级缓存(spring)
- DOM-文档概述、文档节点、元素节点
- 线程和进程区别
- swift之方法(Methods)
- POJ 1459 Power Network DINIC
- 封装
- (十一)洞悉linux下的Netfilter&iptables:iptables命令行工具源码解析【上】
- Java基础——Java的抽象机制,抽象方法抽象类和接口