一对多在现实生活中很常见,今天做了个Hibernate的一对多的实例,也是个入门过程,写下来跟大家分享。

最重要的是xml配置文件,之前因为把英文"(引号)错误的复制成中文的“”(引号),导致后面编译各种出问题,排查了好久,也百度了各种博客,最后发现是引号的问题。

在现实生活中,部门和员工的关系属于一对多的,一个部门有多个员工,一个员工属于一个部门。

第一步,创建Java工程,名字为HibernateMapping,把Hibernate的jar包和sql server的jar包(或者mysql的jar包)导入进来,并创建Employee,Department实体类和xml配置文件。目录结构和hibernate包如下:

第二步,编辑Employee和Department实体类,代码如下:

 package cn.hibernate.onetomany;

 public class Employee {
private int empNo;//工号
private String empName;//姓名
private Department dep;//部门
public int getEmpNo() {
return empNo;
}
public void setEmpNo(int empNo) {
this.empNo = empNo;
}
public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
public Department getDep() {
return dep;
}
public void setDep(Department dep) {
this.dep = dep;
}
public Employee(int empNo, String empName, Department dep) { this.empNo = empNo;
this.empName = empName;
this.dep = dep;
} public Employee(){ }
}

Employee.java

 package cn.hibernate.onetomany;

 import java.util.HashSet;
import java.util.Set; public class Department {
private int depId;//部门号
private String depName;//部门名
private Set<Employee> emps = new HashSet<Employee>();
public int getDepId() {
return depId;
}
public void setDepId(int depId) {
this.depId = depId;
}
public String getDepName() {
return depName;
}
public void setDepName(String depName) {
this.depName = depName;
}
public Set<Employee> getEmps() {
return emps;
}
public void setEmps(Set<Employee> emps) {
this.emps = emps;
} public Department(int depId, String depName, Set<Employee> emps) {
this.depId = depId;
this.depName = depName;
this.emps = emps;
} public Department(){ }
}

Department.java

两个实体类的代码要注意的是它们要有属性的get和set方法,而且在部门类中有员工的集合,员工类中有部门的属性。

第三步,编辑hibernate的核心配置文件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.dialect">
org.hibernate.dialect.SQLServer2005Dialect
<!--mysql的方言:org.hibernate.dialect.MySQLDialect-->
</property> <property name="hibernate.connection.driver_class">
com.microsoft.sqlserver.jdbc.SQLServerDriver
<!--mysql的驱动:com.mysql.jdbc.Driver-->
</property> <property name="hibernate.connection.url">
jdbc:sqlserver://10.86.57.121:1433;DatabaseName=HibernateDemo;
<!--mysql的数据库:jdbc:mysql:///hibernate_demo-->
</property> <property name="hibernate.connection.username">sa<!--mysql的登录名:root --></property>
<property name="hibernate.connection.password">123456</property> <!--
<property name=“hibernate.show_sql”>true</property>
<property name=“hibernate.format_sql”>true</property>
<property name=“hibernate.hbm2ddl.auto”>create</property>
-->
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property> <mapping resource="cn/hibernate/onetomany/department.hbm.xml" />
<mapping resource="cn/hibernate/onetomany/employee.hbm.xml"/>
</session-factory>
</hibernate-configuration>

hibernate.cfg.xml

这个配置文件很重要,我出的各种问题都在这里,比如中文引号和约束文件:

<!DOCTYPE hibernate-configuration PUBLIC  
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"  
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

有的博客写的是http://www.hibernate.org/hibernate-configuration-3.0.dtd什么的,结果导致hibernate无法加载,所以还是用http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd更靠谱

第四步,编辑hibernate的映射文件,代码如下:

 <?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping>
<class name="cn.hibernate.onetomany.Employee" table="t_emp">
<id name="empNo" column="empNo">
<generator class="native"></generator>
</id> <property name="empName"></property>
<!-- name是一的一方的属性,即在Employee.java中定义的private Department那个变量
column是外键,这个要跟另一个映射文件的外键一致
-->
<many-to-one name="dep" column="dep_emp_id" class="cn.hibernate.onetomany.Department"></many-to-one>
</class>
</hibernate-mapping>

employee.hbm.xml

 <?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping>
<class name="cn.hibernate.onetomany.Department" table="t_dep">
<id name="depId" column="depId" type="int">
<generator class="native"></generator>
</id> <property name="depName"></property>
<!-- name是多的一方的属性,即在Department.java中定义的private Set<Employee>那个变量 -->
<set name="emps">
<!-- column是外键,和另一个映射文件的外键对应 -->
<key column="dep_emp_id"></key>
<one-to-many class="cn.hibernate.onetomany.Employee"/>
</set>
</class>
</hibernate-mapping>

department.hbm.xml

这两个配置文件也很重要,而且比较难理解,一定要注意谁是多的一方,谁是一的一方

第五步,编写测试程序MainTest.java,代码如下:

 package cn.hibernate.onetomany;

 import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test; public class MainTest {
@Test
public void test(){
Configuration cfg = new Configuration().configure();
SessionFactory factory = cfg.buildSessionFactory();
Session session = null; session = factory.openSession();
Transaction tx = session.beginTransaction(); Department dep = new Department();
dep.setDepName("Waijiao");
Employee em1 = new Employee();
Employee em2 = new Employee();
em1.setEmpName("Wangyi");
em2.setEmpName("Huachunying"); dep.getEmps().add(em1);
dep.getEmps().add(em2);
em1.setDep(dep);
em2.setDep(dep); session.save(dep);
session.save(em1);
session.save(em2); System.out.println("Add Success!");
tx.commit();
}
}

MainTest.java

这个是测试,也可以写成main主函数,但是那样要有捕获异常以及事务回滚等操作。

最后,Run as JUnit Test,再查看数据库,新建了t_dep和t_emp表,查询两个表的结果,都已经更新完成。

外交部,里面有我们酷酷的王毅部长和亲爱的华春莹,中国必强~

欢迎大家留言讨论

05-11 19:39