Thomas Darimont
Erfahrenes Mitglied
Hallo,
//Einleitung...
...hier mal ein kleines Beispiel zur Kombination von Spring.NET und NHibernate am Beispiel
eines einfachen Dienstes der Personen speichern und wieder auslesen kann. Der (Dumme)Service delegiert in unserem
Beispiel einfach die entsprechenden Aufrufe an eine DAO (Data Access Objekt) welches den Hibernate Support vom
SpringFramework verwendet. Die gesamte Anwendung konfigurieren wir über Spring.
Unser IPersonService Interface:
Unsere PersonService Implementierung:
Unser IPersonDAO Interface:
Unsere PersonDAO Implementierung (Wir verwenden Hibernate als Persistenz Mechanismus)
Unsere Person Domain Object das wir Persistieren wollen:
Das entsprechende Hibernate Mapping File:
Wichtig! In diesem Beispiel muss dieses Mapping als Eingebette Ressource (Embedded Resource) deklariert sein.
Hier unsere Springframework.net Konfiguration in einem Standard App.config File:
Die Tabelle in der MySQL Datenbank:
Ausführen des Beispiels:
Beispiel Ausgabe:
Das Projekt (ohne) Bin (Release oder Debug) findet man im Anhang.
Um das ganze zum Laufen zu bekommen muss man die Source Versionen von:
Spring.NET 1.1.0 Preview 3
http://www.springframework.net/download.html
Spring.NET NHibernate Integration
http://www.springframework.net/downloads/Spring.Data.NHibernate/
nhibernate 1.2.0.Beta2
http://sourceforge.net/project/showfiles.php?group_id=73818
in die Solution mit aufnehmen... und dann alles zusammen neu Kompilieren. Es kann auch sein, dass die Proejkte unterschiedliche Versionen von log4net verwenden... bei mir hats funktioniert, wenn ich die Version aus dem Spring.Net bin-Distributionsverzeichnis genommen habe.
Ach ja für das Beispiel braucht man noch den MySql.NET DataProvider:
http://mysql.org/downloads/connector/net/1.0.html
In diesem Beispiel hab iche der einfachheit halber auf die Verwendung eines Spring.Transaction.Interceptor.TransactionProxyFactoryObject's verzichtet. Damit ist es möglich in der Konfiguration (deklarativ) Methoden-Patterns anzugeben die unter bestimmten Transaction-Propagation Konfigurationen (Propagation Required, Requires New, Supported, Not Support, Never, Mandatory, Nested) ausgeführt werden sollen.
Gruß Tom
//Einleitung...
...hier mal ein kleines Beispiel zur Kombination von Spring.NET und NHibernate am Beispiel
eines einfachen Dienstes der Personen speichern und wieder auslesen kann. Der (Dumme)Service delegiert in unserem
Beispiel einfach die entsprechenden Aufrufe an eine DAO (Data Access Objekt) welches den Hibernate Support vom
SpringFramework verwendet. Die gesamte Anwendung konfigurieren wir über Spring.
Unser IPersonService Interface:
C#:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using Person = De.Tutorials.Training.Spring.Domain.Person;
namespace De.Tutorials.Training.Spring.Services
{
public interface IPersonService
{
void Save(Person person);
void Delete(Person person);
IList FindAll();
}
}
Unsere PersonService Implementierung:
C#:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using IPersonDAO = De.Tutorials.Training.Spring.DAO.IPersonDAO;
using Person = De.Tutorials.Training.Spring.Domain.Person;
namespace De.Tutorials.Training.Spring.Services.Internal
{
public class PersonService : IPersonService
{
private IPersonDAO personDAO;
public IPersonDAO PersonDAO
{
get { return personDAO; }
set { personDAO = value; }
}
#region IPersonService Members
public void Save(Person person)
{
PersonDAO.MakePersistent(person);
}
public void Delete(Person person)
{
PersonDAO.MakeTransient(person);
}
public IList FindAll()
{
return PersonDAO.FindAll();
}
#endregion
}
}
Unser IPersonDAO Interface:
C#:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using Person = De.Tutorials.Training.Spring.Domain.Person;
namespace De.Tutorials.Training.Spring.DAO
{
public interface IPersonDAO
{
void MakePersistent(Person person);
void MakeTransient(Person person);
IList FindAll();
}
}
Unsere PersonDAO Implementierung (Wir verwenden Hibernate als Persistenz Mechanismus)
C#:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Data;
using Person = De.Tutorials.Training.Spring.Domain.Person;
using AdoDaoSupport = Spring.Data.Support.AdoDaoSupport;
using HibernateDaoSupport = Spring.Data.NHibernate.Support.HibernateDaoSupport;
namespace De.Tutorials.Training.Spring.DAO.Internal
{
public class PersonDAO : HibernateDaoSupport, IPersonDAO
{
#region IPersonDAO Members
public void MakePersistent(Person person)
{
this.HibernateTemplate.SaveOrUpdate(person);
}
public void MakeTransient(Person person)
{
this.HibernateTemplate.Delete(person);
}
public IList FindAll()
{
return this.HibernateTemplate.Find("FROM Person");
}
#endregion
}
}
Unsere Person Domain Object das wir Persistieren wollen:
C#:
using System;
using System.Collections.Generic;
using System.Text;
namespace De.Tutorials.Training.Spring.Domain
{
public class Person
{
public Person()
{
}
public Person(string firstName, string lastName)
{
this.firstName = firstName;
this.lastName = lastName;
}
private int id;
public int Id
{
get { return id; }
set { id = value; }
}
private string firstName;
public string FirstName
{
get { return firstName; }
set { firstName = value; }
}
private string lastName;
public string LastName
{
get { return lastName; }
set { lastName = value; }
}
public override string ToString()
{
return this.id + ": " + this.firstName + " " + this.lastName;
}
}
}
Das entsprechende Hibernate Mapping File:
XML:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="De.Tutorials.Training.Spring.Domain.Person, SpringTraining" table="person" lazy="false">
<id name="Id" column="Id" type="Int32">
<generator class="native"/>
</id>
<property name="FirstName" column="firstname" type="String"/>
<property name="LastName" column="lastname" type="String"/>
</class>
</hibernate-mapping>
Hier unsere Springframework.net Konfiguration in einem Standard App.config File:
XML:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="spring">
<section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/>
<section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />
</sectionGroup>
</configSections>
<spring>
<context name="spring.root">
<resource uri="config://spring/objects"/>
</context>
<objects xmlns="http://www.springframework.net" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.net http://www.springframework.net/xsd/spring-objects.xsd">
<object name="personService"
type="De.Tutorials.Training.Spring.Services.Internal.PersonService,SpringTraining">
<property name="personDAO" ref="personDAO"/>
</object>
<object name="personDAO"
type="De.Tutorials.Training.Spring.DAO.Internal.PersonDAO,SpringTraining">
<property name="SessionFactory" ref="sessionFactory"/>
</object>
<object id="dbProvider" type="Spring.Data.Support.SqlProvider, Spring.Data">
<property name="ConnectionString" value="Data Source=localhost;Initial Catalog=test;User Id=root;Password=tutorials"/>
</object>
<object id="sessionFactory" type="Spring.Data.NHibernate.LocalSessionFactoryObject, Spring.Data.NHibernate">
<property name="dbProvider" ref="dbProvider"/>
<property name="HibernateProperties">
<dictionary>
<entry key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider"/>
<entry key="hibernate.dialect" value="NHibernate.Dialect.MySQLDialect"/>
<entry key="hibernate.connection.driver_class" value="NHibernate.Driver.MySqlDataDriver"/>
</dictionary>
</property>
<property name="MappingAssemblies">
<list>
<value>SpringTraining</value>
</list>
</property>
</object>
<object id="hibernateTransactionManager" type="Spring.Data.NHibernate.HibernateTransactionManager, Spring.Data.NHibernate">
<property name="dbProvider" ref="dbProvider"/>
<property name="sessionFactory" ref="sessionFactory"/>
</object>
</objects>
</spring>
</configuration>
Die Tabelle in der MySQL Datenbank:
Code:
mysql> desc person;
+-----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| firstname | varchar(255) | YES | | NULL | |
| lastname | varchar(255) | YES | | NULL | |
+-----------+--------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
mysql> select * from person;
Empty set (0.00 sec)
Ausführen des Beispiels:
Beispiel Ausgabe:
Code:
32: Thomas633015665742656250 Darimont
33: Bart633015665742656250 Simpson
Drücken Sie eine beliebige Taste . . .
Code:
mysql> select * from person;
+----+--------------------------+----------+
| id | firstname | lastname |
+----+--------------------------+----------+
| 32 | Thomas633015665742656250 | Darimont |
| 33 | Bart633015665742656250 | Simpson |
+----+--------------------------+----------+
2 rows in set (0.00 sec)
Das Projekt (ohne) Bin (Release oder Debug) findet man im Anhang.
Um das ganze zum Laufen zu bekommen muss man die Source Versionen von:
Spring.NET 1.1.0 Preview 3
http://www.springframework.net/download.html
Spring.NET NHibernate Integration
http://www.springframework.net/downloads/Spring.Data.NHibernate/
nhibernate 1.2.0.Beta2
http://sourceforge.net/project/showfiles.php?group_id=73818
in die Solution mit aufnehmen... und dann alles zusammen neu Kompilieren. Es kann auch sein, dass die Proejkte unterschiedliche Versionen von log4net verwenden... bei mir hats funktioniert, wenn ich die Version aus dem Spring.Net bin-Distributionsverzeichnis genommen habe.
Ach ja für das Beispiel braucht man noch den MySql.NET DataProvider:
http://mysql.org/downloads/connector/net/1.0.html
In diesem Beispiel hab iche der einfachheit halber auf die Verwendung eines Spring.Transaction.Interceptor.TransactionProxyFactoryObject's verzichtet. Damit ist es möglich in der Konfiguration (deklarativ) Methoden-Patterns anzugeben die unter bestimmten Transaction-Propagation Konfigurationen (Propagation Required, Requires New, Supported, Not Support, Never, Mandatory, Nested) ausgeführt werden sollen.
Gruß Tom
Anhänge
Zuletzt bearbeitet von einem Moderator: