使用学生-教师进行测试:
如下图:
在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);
}
@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报的错,所以肯定是对象上加的注解有问题。