大家一定知道关系数据库之间常用的两种关系 ,一对多,多对多,
一对多关系展开成数据库表是两张表,而多对多是三张表,有一张表存放的是关系,我想还是上学时的数据库原理说得很清楚,
下面就得来hibernate 来存储多对多关系,下面是eclipse项目结构,上一篇文章说了,类库是怎么引用的,怕里不说了,代码根目录有hibernate的主配置文件,两个实体包中有对应映射文件,根目录下还有个log4j的properties文件,
下面给出代码,
event.java
person.java
HibernateUtil.java 这个类就写了个怎么得到sessionFactory,
HManage.java 这是来测试的,写了对象的持久化,和添加关系
下面给出配置文件了,
Event.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">
<hibernate-mapping>
<class name="events.Event" table="EVENTS" >
<id name="id" column="EVENT_ID">
<generator class="native"></generator>
</id>
<property name="dateString" column="EVENT_DATE">
</property>
<property name="title" column="EVENT_TITLE"></property>
<set name="persons" table="PERSON_EVENT">
<key column="EVENT_ID">
</key>
<many-to-many column="PERSON_ID" class="person.Person"></many-to-many>
</set>
</class>
</hibernate-mapping>
Person.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">
<hibernate-mapping>
<class name="person.Person" table="Person" >
<id name="id" column="PERSON_ID">
<generator class="native"></generator>
</id>
<property name="age"></property>
<property name="firstname"></property>
<property name="lastname"></property>
<set name="events" table="PERSON_EVENT">
<key column="PERSON_ID">
</key>
<many-to-many column="EVENT_ID" class="events.Event"></many-to-many>
</set>
</class>
</hibernate-mapping>
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>
<!-- 是否显示SQL语句 -->
<property name="show_sql">true</property>
<!-- SQL数据库方言SQLServer -->
<property name="dialect">org.hibernate.dialect.SQLServerDialect</property>
<!-- JDBC Driver -->
<property name="connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
<!-- JDBC URL -->
<property name="connection.url">jdbc:sqlserver://TINY/SQLSERVER2005;DatabaseName=HibernateStudy;</property>
<!-- 用户名-->
<property name="connection.username">sa</property>
<!-- 密码 -->
<property name="connection.password">deng</property>
<!--数据库连接池-->
<property name="c3p0.min_size">5</property>
<property name="c3p0.max_size">20</property>
<property name="c3p0.timeout">1800</property>
<property name="c3p0.max_statements">50</property>
<!-- 配置每次提交SQL的数量 -->
<property name=" hibernate.jdbc.batch_size">50</property>
<mapping resource="events/Event.hbm.xml"/>
<mapping resource="person/Person.hbm.xml"/>
</session-factory>
</hibernate-configuration>
还有就是数据库结构,
下面是sql ,2005, 大意是两个实体,id是自增,还有个是关系表,就是这样,
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[PERSON_EVENT](
[PERSON_ID] [int] NOT NULL,
[EVENT_ID] [int] NOT NULL
) ON [PRIMARY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[EVENTS](
[EVENT_ID] [int] IDENTITY(1,1) NOT NULL,
[EVENT_DATE] [varchar](50) NULL,
[EVENT_TITLE] [nchar](100) NULL,
CONSTRAINT [PK_EVENTS] PRIMARY KEY CLUSTERED
(
[EVENT_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Person](
[PERSON_ID] [int] IDENTITY(1,1) NOT NULL,
[age] [int] NULL,
[firstname] [nchar](20) NULL,
[lastname] [nchar](20) NULL,
CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED
(
[PERSON_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
--如此,已经行了,测试时我输出了person.events.size()和,enent.persons.size(),结果在代码中可以看到,上面这些输出很多,原因是输出了日志,输出了显示sql,不加log4j,和show_sql=false,可以看到简单结果,
多对多关系, 即是如此,当然hibernate中还有此问题等待我们,如 继承,map,set ,这些的持久化,以后文章会写出来,希望对后来的学习者有所帮助,文章是写得简单了一点,但已经交代了个主体,具体还得看一下hibernate的官方文档,