Hibernate从入门到精通(6)- 双向 多对多

使用学生-教师进行测试:

如下图:


在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"/>


6.使用JUnit测试:

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);
	}
	
	@Before
	public void init(){
		session = factory.openSession();
	}
	
	@Ignore
	@Test
	public 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
	@Test
	public void testGet(){
		StudentInfo student = (StudentInfo) session.get(StudentInfo.class, 1);
		System.out.println(student);
	}
	
	@After
	public 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值