频道栏目
首页 > 资讯 > 其他 > 正文

Hibernate的多对多的XML映射教程

12-08-27        来源:[db:作者]  
收藏   我要投稿

1。创建数据库
在这个例子中,我们将MySQL数据库。我们使用的是一个多一对多的关系。例如员工会议之间的关系。每个员工都可以达到一个以上的会议,每个会议可以有一个以上的雇员
许多到许多关系图


CREATE TABLE `employee` (
 `employee_id` BIGINT(10) NOT NULL AUTO_INCREMENT,
 `firstname` VARCHAR(50) NULL DEFAULT NULL,
 `lastname` VARCHAR(50) NULL DEFAULT NULL,
 PRIMARY KEY (`employee_id`)
)


CREATE TABLE `meeting` (
 `meeting_id` BIGINT(20) NOT NULL AUTO_INCREMENT,
 `subject` VARCHAR(50) NOT NULL,
 `meeting_date` DATE NOT NULL,
 PRIMARY KEY (`meeting_id`)
)


CREATE TABLE `employee_meeting` (
 `employee_id` BIGINT(20) NOT NULL,
 `meeting_id` BIGINT(20) NOT NULL,
 PRIMARY KEY (`employee_id`, `meeting_id`),
 INDEX `FK_MEETING` (`meeting_id`),
 CONSTRAINT `FK_EMPLOYEE` FOREIGN KEY (`employee_id`) REFERENCES `employee` (`employee_id`),
 CONSTRAINT `FK_MEETING` FOREIGN KEY (`meeting_id`) REFERENCES `meeting` (`meeting_id`)
)
2。Hibernate的Maven的依赖关系
我们正在使用Maven的依赖管理。复制后,在pom.xml。

文件:pom.xml的

<project xmlns="http://maven.apache.org/POM/4.0.0"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <groupId>net.viralpatel.hibernate</groupId>
 <artifactId>HibernateHelloWorldXML</artifactId>
 <packaging>jar</packaging>
 <version>1.0-SNAPSHOT</version>
 <name>HibernateHelloWorldXML</name>
 <url>http://maven.apache.org</url>
 <dependencies>
  <dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
   <version>5.1.10</version>
  </dependency>
  <dependency>
   <groupId>org.hibernate</groupId>
   <artifactId>hibernate</artifactId>
   <version>3.2.6.ga</version>
  </dependency>
 </dependencies>
</project>
3。Hibernate的模型类
员工和部门创建模型类映射到相应的数据库表。

文件“:Employee.java”

package net.viralpatel.hibernate;

import java.util.HashSet;
import java.util.Set;

public class Employee {

 private Long employeeId;
 private String firstname;
 private String lastname;

 private Set<Meeting> meetings = new HashSet<Meeting>();
 
 public Employee() {
 }

 public Employee(String firstname, String lastname) {
  this.firstname = firstname;
  this.lastname = lastname;
 }
 
 // Getter and Setter methods
}
文件“:Meeting.java”

package net.viralpatel.hibernate;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

public class Meeting {

 private Long meetingId;
 private String subject;
 private Date meetingDate;

 private Set<Employee> employees = new HashSet<Employee>();
 
 public Meeting(String subject) {
  this.subject = subject;
  this.meetingDate = new Date();
 }
 
 // Getter and Setter methods
}
4。Hibernate工具类
要访问Hibernate的API,我们将创建一个包装器实用工具类,它为我们提供了SessionFactory的。

文件“:HibernateUtil.java”

package net.viralpatel.hibernate;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {

 private static final SessionFactory sessionFactory = buildSessionFactory();

 private static SessionFactory buildSessionFactory() {
  try {
   // Create the SessionFactory from hibernate.cfg.xml
   return new Configuration().configure().buildSessionFactory();
  } catch (Throwable ex) {
   System.err.println("Initial SessionFactory creation failed." + ex);
   throw new ExceptionInInitializerError(ex);
  }
 }

 public static SessionFactory getSessionFactory() {
  return sessionFactory;
 }
}
5。Hibernate映射XML(HBM)
以下是为每个enitity员工和部门的Hibernate映射文件。

文件“:Employee.hbm.xml”

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="net.viralpatel.hibernate">

 <class name="Employee" table="EMPLOYEE">
  <id name="employeeId" column="EMPLOYEE_ID">
   <generator class="native" />
  </id>

  <property name="firstname" />
  <property name="lastname" column="lastname" />

  <set name="meetings" table="EMPLOYEE_MEETING"
   inverse="false" lazy="true" fetch="select" cascade="all">
   <key column="EMPLOYEE_ID" />
   <many-to-many column="MEETING_ID" class="Meeting" />
  </set>

 </class>
</hibernate-mapping>
文件“:Meeting.hbm.xml”

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="net.viralpatel.hibernate">

 <class name="Meeting" table="MEETING">

  <id name="meetingId" type="java.lang.Long"
   column="MEETING_ID">
   <generator class="native" />
  </id>

  <property name="subject" column="SUBJECT" />
  <property name="meetingDate" type="date" column="MEETING_DATE" />

  <set name="employees" table="EMPLOYEE_MEETING"
   inverse="true" lazy="true" fetch="select">
   <key column="EMPLOYEE_ID" />
   <many-to-many column="MEETING_ID" class="Meeting" />
  </set>

 </class>
</hibernate-mapping>
有一件事是值得一提的是,我们所提到的关键字逆=“trueâ 会议类员工关系所有者。因此,员工的模型需要更新引用键依赖模型的照顾。

6。Hibernate的配置文件
添加hibernate.cfg.xml文件在您的项目中。

文件: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="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/tutorial</property>
        <property name="connection.username">root</property>
        <property name="connection.password"></property>
       
        <property name="connection.pool_size">1</property>
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="current_session_context_class">thread</property>
        <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
        <property name="show_sql">true</property>
        <property name="hbm2ddl.auto">validate</property>
 
        <mapping resource="net/viralpatel/hibernate/Employee.hbm.xml"/>
        <mapping resource="net/viralpatel/hibernate/Meeting.hbm.xml"/>
   
    </session-factory>
</hibernate-configuration>
7。审查项目结构

Hibernate的许多一对多的例子项目结构
请注意,我们已经使用SET映射会议,与员工,反之亦然。一个<SET>不同之处在于,它可以只存储唯一的对象。这意味着没有重复的元素可以包含在一组。当您添加第二次一套相同的元素,它将会取代旧的。一组是无序的,但默认情况下,我们可以要求它进行排序。在Java中的一个<SET>的相应类型的java.util.Set映射。

执行例如
文件:Main.java文件

package net.viralpatel.hibernate;
 
import org.hibernate.Session;
import org.hibernate.SessionFactory;
 
public class Main {
 
    public static void main(String[] args) {
 
        SessionFactory sf = HibernateUtil.getSessionFactory();
        Session session = sf.openSession();
        session.beginTransaction();
 
       
        Meeting meeting1 = new Meeting("Quaterly Sales meeting");
        Meeting meeting2 = new Meeting("Weekly Status meeting");
       
        Employee employee1 = new Employee("Sergey", "Brin");
        Employee employee2 = new Employee("Larry", "Page");

        employee1.getMeetings().add(meeting1);
        employee1.getMeetings().add(meeting2);
        employee2.getMeetings().add(meeting1);
       
        session.save(employee1);
        session.save(employee2);
       
        session.getTransaction().commit();
        session.close();
    }
}
输出:

Hibernate: insert into EMPLOYEE (firstname, lastname) values (?, ?)
Hibernate: insert into MEETING (SUBJECT, MEETING_DATE) values (?, ?)
Hibernate: insert into MEETING (SUBJECT, MEETING_DATE) values (?, ?)
Hibernate: insert into EMPLOYEE (firstname, lastname) values (?, ?)
Hibernate: insert into EMPLOYEE_MEETING (EMPLOYEE_ID, MEETING_ID) values (?, ?)
Hibernate: insert into EMPLOYEE_MEETING (EMPLOYEE_ID, MEETING_ID) values (?, ?)
Hibernate: insert into EMPLOYEE_MEETING (EMPLOYEE_ID, MEETING_ID) values (?, ?)

相关TAG标签
上一篇:维护经验:防止垃圾评论(留言)的大量产生
下一篇:Linux入门:计算机组件介绍
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站