using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NHibernate.Cfg;
using System.Reflection;
using NHibernate;
using System.Threading;
namespace TestTwoTable
{
class Program
{
static void Main(string[] args)
{
if(1 == 1)
{
IList<Phone> phones = PhoneList();
foreach(Phone p in phones)
{
Console.WriteLine("Phone {0}", p.PhoneNumber);
// Try to comment/uncomment Console.WriteLines so you can
// verify that NHibernate indeed lazy loads related parent record,
// check your RDBMS log query(s) timestamps to verify that.
//
// When using Postgresql on Linux, the log file is in /opt/Postgresql/9.0/data/pg_log
// On Mac it is in /Library/PostgreSQL/9.0/data/pg_log
// On Windows it is in C:\Program Files (x86)\PostgreSQL\9.0\data\pg_log
Console.WriteLine("Owned by {0}", p.Kontact.ContactName);
// With lazy loading, the p.Kontact's Phones will not be queried unnecessarily.
// The p.Kontact's Phones will only be queried from database when you access it.
// Try to comment/uncomment the following code and see that effect in your RDBMS log file. .
/*
foreach(Phone p in p.Kontact.Phones)
{
Console.WriteLine("Contact's phone {0}", p.PhoneNumber);
}*/
}
}
Console.WriteLine("*****");
if(1 == 1)
{
IList<Contact> contacts = ContactList();
foreach(Contact c in contacts)
{
Console.WriteLine("\nContact {0}'s Phone(s): ", c.ContactName);
// With lazy loading, the c's Phones will not be queried unnecessarily.
// The c's Phones will only be queried from database when you access it.
// Try to comment/uncomment the following code and see that effect in your RDBMS log file .
foreach(Phone p in c.Phones)
{
Console.WriteLine("Phone {0}", p.PhoneNumber);
}
}
}
}
static ISession OpenSession()
{
var c = new Configuration();
c.AddAssembly(Assembly.GetCallingAssembly());
ISessionFactory f = c.BuildSessionFactory();
return f.OpenSession();
}
static IList<Phone> PhoneList()
{
ISession session = OpenSession();
IQuery query = session.CreateQuery("from Phone p where p.Kontact.ContactName = :_contact_name");
query.SetParameter("_contact_name", "lennon");
IList<Phone> contacts = query.List<Phone>();
return contacts;
}
static IList<Contact> ContactList()
{
ISession session = OpenSession();
IQuery query = session.CreateQuery("from Contact");
IList<Contact> contacts = query.List<Contact>();
return contacts;
}
}
public class Contact
{
public virtual int ContactId { get; set; }
public virtual string ContactName { get; set; }
public virtual IList<Phone> Phones { get; set; }
}
public class Phone
{
public virtual Contact Kontact { get; set; }
public virtual int PhoneId { set; get; }
public virtual string PhoneNumber { get; set; }
}
}
Mapping:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="true" assembly="TestTwoTable" namespace="TestTwoTable">
<class name="Contact" table="contact">
<id name="ContactId" column="contact_id">
<generator class="sequence">
<param name="sequence">contact_contact_id_seq</param>
</generator>
</id>
<property name="ContactName" column="contact_name"/>
<bag name="Phones" inverse="true">
<key column="contact_id"/>
<one-to-many class="Phone"/>
</bag>
</class>
<class name="Phone" table="phone">
<id name="PhoneId" column="phone_id">
<generator class="sequence">
<param name="sequence">phone_phone_id_seq</param>
</generator>
</id>
<property name="PhoneNumber" column="phone_number"/>
<many-to-one name="Kontact" column="contact_id" class="Contact" not-null="true"/>
</class>
</hibernate-mapping>
The Database:
CREATE TABLE contact
(
contact_id serial NOT NULL,
contact_name text NOT NULL,
CONSTRAINT contact_pkey PRIMARY KEY (contact_id)
);
CREATE TABLE phone
(
contact_id integer NOT NULL,
phone_id serial NOT NULL,
phone_number text NOT NULL,
CONSTRAINT phone_pkey PRIMARY KEY (phone_id),
CONSTRAINT fk_phone__contact FOREIGN KEY (contact_id)
REFERENCES contact (contact_id)
);
insert into contact(contact_name) values('lennon'),('mccartney');
insert into phone(contact_id, phone_number) values(1,'number nine'),(1,'number 10'),(2,'you know my name, look up the number');
Output:
Phone number nine Owned by lennon Phone number 10 Owned by lennon ***** Contact lennon's Phone(s): Phone number nine Phone number 10 Contact mccartney's Phone(s): Phone you know my name, look up the number

No comments:
Post a Comment