第一种方式:在数据库中不需要中间表,而是直接在多方的表中加以列一方的id;
看一下建表的SQL
sql 代码
- create table people(id bigint not null auto_increment primary key,name varchar(20) not null);
- create table location(id bigint not null auto_increment,peopleId bigint not null,addr varchar(20) not null,primary key(id,peopleId));
在location表中添加一个peopleId的字段以存储people表的id,已确定关联关系;
下面分别看一下两个类的映射文件:
People类:
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">
- <hibernate-mapping package="org.test.bean">
- <class name="People" table="people">
- <id name="id" column="id">
- <generator class="native"/>
- </id>
- <property name="name" type="string" column="name"/>
- <set name="locations" cascade="save-update" lazy="false">
- <key column="peopleId"/>
- <one-to-many class="Location"/>
- </set>
- </class>
- </hibernate-mapping>
Location 类:
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">
- <hibernate-mapping
- package="org.test.bean">
- <class name="Location" table="location">
- <id name="id" column="id">
- <generator class="native"/>
- </id>
- <property name="peopleId" type="integer" column="peopleId"/>
- <property name="addr" type="string" column="addr"/>
- </class>
- </hibernate-mapping>
这样就可以简单的实现一对多的关联关系的映射。关于set的设置还有很多属性,可以自己参考查阅。
第二种方式:通过中间表关联关系双方,把存在关系双方的id存储在中间表中;
看一下sql语句:
sql 代码
- create table person(id bigint not null auto_increment primary key,name varchar(20) not null);
- create table personaddress(personId bigint not null, addressId bigint not null, primary key (personId, addressId) );
- create table address(id bigint not null auto_increment primary key,addr varchar(20) not null);
可以看到共建立了三张表,person、personaddress、address;其中personaddress表中存储的是关联双方的id;
下面看一下映射文件:
Person类:
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">
- <hibernate-mapping package="org.test.bean">
- <class name="Person" table="person">
- <id name="id" column="id">
- <generator class="native"/>
- </id>
- <property name="name" type="string" column="name"/>
- <set name="addresses" table="personaddress" lazy="false">
- <key column="personId"/>
- <many-to-many column="addressId"
- class="Address"/>
- </set>
- </class>
- </hibernate-mapping>
Address类:
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">
- <hibernate-mapping
- package="org.test.bean">
- <class name="Address" table="address">
- <id name="id" column="id">
- <generator class="native"/>
- </id>
- <property name="addr" type="string" column="addr"/>
- </class>
- </hibernate-mapping>
这样就可以实现一对多关系的映射。
大家看了也许就会明白,废话不说了。
另外看一下hibernate配置文件,把上面的映射文件全部导入hibernate文件中就可以享受hibernate之旅了:
xml 代码
- <!DOCTYPE hibernate-configuration PUBLIC
- "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
- <hibernate-configuration>
- <session-factory name="foo">
- <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
- <property name="connection.url">jdbc:mysql://localhost:3306/relation</property>
- <property name="connection.username">root</property>
- <property name="connection.password">mysql</property>
- <property name="show_sql">true</property>
- <mapping resource="org/test/bean/Person.hbm.xml"/>
- <mapping resource="org/test/bean/Address.hbm.xml"/>
- <mapping resource="org/test/bean/People.hbm.xml"/>
- <mapping resource="org/test/bean/Location.hbm.xml"/>
- </session-factory>
- </hibernate-configuration>
看一下简单的SessionFactory工具类:
java 代码
- package org.test.hibernate;
- import org.hibernate.SessionFactory;
- import org.hibernate.cfg.Configuration;
- public class HibernateUtil {
- public HibernateUtil() {
- // TODO Auto-generated constructor stub
- }
- private static final SessionFactory sessionFactory;
- static {
- try {
- // Create the SessionFactory from hibernate.cfg.xml
- sessionFactory = new Configuration().configure().buildSessionFactory();
- } catch (Throwable ex) {
- // Make sure you log the exception, as it might be swallowed
- System.err.println("Initial SessionFactory creation failed." + ex);
- throw new ExceptionInInitializerError(ex);
- }
- }
- public static SessionFactory getSessionFactory() {
- return sessionFactory;
- }
- }