NHibernate中的many-to-many关系示范(转)
NHibernate中的many-to-many关系示范
1. 生成数据库
use master
go
create database Hibernate
go
use Hibernate
go
create table Users (user_id int identity primary key, name varchar(100))
go
create table Groups(group_id int identity primary key, name varchar(100), description varchar(100))
go
create table UserGroups (group_id int foreign key references Groups(group_id),
user_id int foreign key references Users(user_id))
go
2. User.cs
using System;
using System.Collections;
public class User {
public User() {
}
public int UserId
{
get { return userId; }
set { userId = value; }
}
public string Name
{
get { return name; }
set { name = value; }
}
public IList Groups
{
get { return groups; }
set { groups = value; }
}
private int userId;
private string name;
private IList groups = new ArrayList();
} //class User
3. Group.cs
using System;
using System.Collections;
public class Group {
public Group() {
}
public int GroupId
{
get { return groupId; }
set { groupId = value; }
}
public string Name
{
get { return name; }
set { name = value; }
}
public string Description
{
get { return description; }
set { description = value; }
}
public IList Users
{
get { return users; }
set { users = value; }
}
private int groupId;
private string name;
private string description;
private IList users = new ArrayList();
} //class Group
4. User.hbm.xml
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
<class name="User, UserGroup" table="users">
<id name="UserId" column="user_id" type="Int32"
unsaved-value="0">
<generator class="identity" />
</id>
<property name="Name" column= "name" type="String"/>
<bag name="Groups" table="UserGroups" inverse="true">
<key column="user_id" />
<many-to-many column="group_id" class="Group,
UserGroup" />
</bag>
</class>
</hibernate-mapping>
5. Group.hbm.xml
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
<class name="Group, UserGroup" table="groups">
<id name="GroupId" column="group_id" type="Int32"
unsaved-value="0">
<generator class="identity" />
</id>
<property name="Name" column= "name" type="String"/>
<property name="Description" column= "description"
type="String"/>
<bag name="Users" table="UserGroups">
<key column="group_id" />
<many-to-many column="user_id" class="User, UserGroup"
/>
</bag>
</class>
</hibernate-mapping>
6. TestUser.cs
using System;
using NHibernate;
using NHibernate.Cfg;
using System.Text;
using System.Collections;
using NHibernate.Expression;
public class TestCreate
{
ISession session;
public TestCreate()
{
Configuration cfg = new Configuration();
cfg.AddXmlFile("User.hbm.xml");
cfg.AddXmlFile("Group.hbm.xml");
ISessionFactory factory = cfg.BuildSessionFactory();
session = factory.OpenSession();
}
public void Test()
{
User user1 = new User();
user1.Name = "test1";
User user2 = new User();
user2.Name = "test2";
Group group1 = new Group();
group1.Name = "group1";
Group group2 = new Group();
group2.Name = "group2";
user1.Groups.Add( group2);
user2.Groups.Add( group1 );
group1.Users.Add( user2 );
group2.Users.Add( user1);
ITransaction trans = null;
try {
trans = session.BeginTransaction();
session.Save( user1 );
session.Save( user2 );
session.Save( group1 );
session.Save( group2 );
trans.Commit();
}
catch ( Exception e ) {
if ( trans != null ) trans.Rollback();
throw e;
}
finally {
session.Close();
}
}
static void Main()
{
TestCreate tc = new TestCreate();
tc.Test();
}
}
7. TestUser.exe.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="nhibernate" type="System.Configuration.NameValueSectionHandler, System,
Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, Custom=null" />
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<nhibernate>
<add
key="hibernate.connection.provider"
value="NHibernate.Connection.DriverConnectionProvider"
/>
<add
key="hibernate.dialect"
value="NHibernate.Dialect.MsSql2000Dialect"
/>
<add
key="hibernate.connection.driver_class"
value="NHibernate.Driver.SqlClientDriver"
/>
<add
key="hibernate.connection.connection_string"
value="Server=localhost;initial catalog=hibernate;Integrated Security=SSPI"
/>
<add key="hibernate.show_sql" value="true" />
</nhibernate>
<log4net>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] -%m%n" />
</layout>
<root>
<level value="INFO" />
<appender-ref ref="ConsoleAppender" />
</root>
</appender>
</log4net>
</configuration>
8. UserGroup.dll
csc /t:library /out:UserGroup.dll User.cs Group.cs
9. TestUser.exe
csc /r:Nhibernate.dll,UserGroup.dll TestUser.cs
10. runtime assemblies needed
HashCodeProvider.dll
Iesi.Collections.dll
log4net.dll
NHibernate.dll
1. 生成数据库
CODE:
use master
go
create database Hibernate
go
use Hibernate
go
create table Users (user_id int identity primary key, name varchar(100))
go
create table Groups(group_id int identity primary key, name varchar(100), description varchar(100))
go
create table UserGroups (group_id int foreign key references Groups(group_id),
user_id int foreign key references Users(user_id))
go
2. User.cs
CODE:
using System;
using System.Collections;
public class User {
public User() {
}
public int UserId
{
get { return userId; }
set { userId = value; }
}
public string Name
{
get { return name; }
set { name = value; }
}
public IList Groups
{
get { return groups; }
set { groups = value; }
}
private int userId;
private string name;
private IList groups = new ArrayList();
} //class User
3. Group.cs
CODE:
using System;
using System.Collections;
public class Group {
public Group() {
}
public int GroupId
{
get { return groupId; }
set { groupId = value; }
}
public string Name
{
get { return name; }
set { name = value; }
}
public string Description
{
get { return description; }
set { description = value; }
}
public IList Users
{
get { return users; }
set { users = value; }
}
private int groupId;
private string name;
private string description;
private IList users = new ArrayList();
} //class Group
4. User.hbm.xml
CODE:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
<class name="User, UserGroup" table="users">
<id name="UserId" column="user_id" type="Int32"
unsaved-value="0">
<generator class="identity" />
</id>
<property name="Name" column= "name" type="String"/>
<bag name="Groups" table="UserGroups" inverse="true">
<key column="user_id" />
<many-to-many column="group_id" class="Group,
UserGroup" />
</bag>
</class>
</hibernate-mapping>
5. Group.hbm.xml
CODE:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
<class name="Group, UserGroup" table="groups">
<id name="GroupId" column="group_id" type="Int32"
unsaved-value="0">
<generator class="identity" />
</id>
<property name="Name" column= "name" type="String"/>
<property name="Description" column= "description"
type="String"/>
<bag name="Users" table="UserGroups">
<key column="group_id" />
<many-to-many column="user_id" class="User, UserGroup"
/>
</bag>
</class>
</hibernate-mapping>
6. TestUser.cs
CODE:
using System;
using NHibernate;
using NHibernate.Cfg;
using System.Text;
using System.Collections;
using NHibernate.Expression;
public class TestCreate
{
ISession session;
public TestCreate()
{
Configuration cfg = new Configuration();
cfg.AddXmlFile("User.hbm.xml");
cfg.AddXmlFile("Group.hbm.xml");
ISessionFactory factory = cfg.BuildSessionFactory();
session = factory.OpenSession();
}
public void Test()
{
User user1 = new User();
user1.Name = "test1";
User user2 = new User();
user2.Name = "test2";
Group group1 = new Group();
group1.Name = "group1";
Group group2 = new Group();
group2.Name = "group2";
user1.Groups.Add( group2);
user2.Groups.Add( group1 );
group1.Users.Add( user2 );
group2.Users.Add( user1);
ITransaction trans = null;
try {
trans = session.BeginTransaction();
session.Save( user1 );
session.Save( user2 );
session.Save( group1 );
session.Save( group2 );
trans.Commit();
}
catch ( Exception e ) {
if ( trans != null ) trans.Rollback();
throw e;
}
finally {
session.Close();
}
}
static void Main()
{
TestCreate tc = new TestCreate();
tc.Test();
}
}
7. TestUser.exe.config
CODE:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="nhibernate" type="System.Configuration.NameValueSectionHandler, System,
Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, Custom=null" />
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<nhibernate>
<add
key="hibernate.connection.provider"
value="NHibernate.Connection.DriverConnectionProvider"
/>
<add
key="hibernate.dialect"
value="NHibernate.Dialect.MsSql2000Dialect"
/>
<add
key="hibernate.connection.driver_class"
value="NHibernate.Driver.SqlClientDriver"
/>
<add
key="hibernate.connection.connection_string"
value="Server=localhost;initial catalog=hibernate;Integrated Security=SSPI"
/>
<add key="hibernate.show_sql" value="true" />
</nhibernate>
<log4net>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] -%m%n" />
</layout>
<root>
<level value="INFO" />
<appender-ref ref="ConsoleAppender" />
</root>
</appender>
</log4net>
</configuration>
8. UserGroup.dll
csc /t:library /out:UserGroup.dll User.cs Group.cs
9. TestUser.exe
csc /r:Nhibernate.dll,UserGroup.dll TestUser.cs
10. runtime assemblies needed
HashCodeProvider.dll
Iesi.Collections.dll
log4net.dll
NHibernate.dll