NHibernate i praktiken Vittnesbörd från en användare.

Slides:



Advertisements
Liknande presentationer
Snabbguide och tips.
Advertisements

Interface.  Interface är en datatyp och har alltså egen syntax och en hel del egna regler för vad arv från interface innebär.  Interface är renodlad.
Avlusning Debugger (”avlusare”) Breakpoints Watch.
Databaser & databasdesign
Migrera befintliga system till Windows Azure
Prestandaanalys av JavaScript
Klasser och objekt.
Algoritmer och data strukturer -Länkade listor
Sweden SharePoint User Group WictorWilén
Next previous Internetprogrammering 2000 Internetprogrammering 2000 Föreläsning 10 Distribuerad programmering med Javas RMI, Remote Method Invocation.
Fortsättningskurs i Programmering lektion 6
2I1070 Lektion 2 KTH-MI Peter Mozelius Servlets och databaskopplingar.
Metoder i java Det finns två typer av metoder i java
Arv.
Polymorfism.
Next previous Innehåll Inledning Några enkla exempel Pekare till och kort beskrivning av större exempel Speciella referenser (som används i marginalen)
1 Föreläsning 6 Klass Object, instans av klass public/private Klassvariabler och klassmetoder.
i olika programmeringsspråk
Föreläsning 4, Kapitel 4 Gruppera objekt Kursbok: “Objects First with Java - A Practical Introduction using BlueJ”, David J. Barnes & Michael Kölling.
1 Windows Azure Mikael ÖstbergTorkel Ödegaard. 2.
TDD Börda, befrielse eller rent av en omöjlighet?.
Pointers. int a=5; int f(int b) { a--; b++; return b; } int main() { int a=3; printf("%d,",f(a)); printf("%d",a); return 0; }
Källor! Hur gör man egentligen?
Föreläsning 2 Kort Översikt Över Javaspråket. Källkodsformat Unicode används åäöμψζ tillåtna Inte alla miljöer klarar av det Källkod Bytekod Java VM för.
ASP.NET MVC4 + NoSQL = Major Awesomness. IoC Container.
1 ITK:P1 Föreläsning 7 Algoritmer och datastrukturer DSV Marie Olsson.
Vektorer (klassen Vector) Sortering
Max start-guide Liten och väldigt snabbt ihopkastad.
Mer om arv - Polymorfism Kursbok: “Objects First with Java - A Practical Introduction using BlueJ”, David J. Barnes & Michael Kölling Fredric Ragnar
Arv.
DATABASHANTERING för programmerare Lektion 3 Mahmud Al Hakim
DATABASHANTERING för programmerare Lektion 4 Mahmud Al Hakim
Mitt första Java program Mahmud Al Hakim Copyright, Mahmud Al Hakim, 1.
Databashantering MS Access 2003 Lektion 2
Exempelbaserade specifikationer med SpecFlow
Föreläsning 5, Kapitel 5 Använda Java-bibliotek för att få avancerad funktionalitet Kursbok: “Objects First with Java - A Practical Introduction using.
Flexicon – Din systempartner
UTVECKLING MED RAMVERKET.NET Marcus Medina. Dagens visdomsord “Det verkar alltid omöjligt tills dess att det är gjort” Nelson Mandela.
FRÅGEUTVECKLING INOM MSSQL Marcus Medina. Dagens visdomsord ” Exercitatio artem parat ” (Övning ger färdighet) - Tacitus, Germania 24.
Java servlets och databaskopplingar
Mahmud Al Hakim 2  Mål för kursen  Kursplanering  Kurslitteratur  Betygsättning  Grunder om databaser  Tabeller.
Next previous RMI, Remote Method Invocation Om du har boken av Marty Hall, läs avsnitt 15.8 För fler exempel se:
Föreläsning 1 Reserverade ord Javas API Identifierare Litteraler Variabler Kompilering och interpretering.
Topobase årsmöte 2009 Solna 3D Bakgrund Solna Stad beslut att på klienterna gå över till Vista (nov- dec) Autodesk Topobase 2 med 3D-data.
Microsoft Visual Studio och.NET Framework, idag och imorgon! Robert Folkesson
1 Windows Azure Mikael ÖstbergTorkel Ödegaard. 2 Äshur Ashore Azzuure.
KONSTEN ATT SKRIVA BRA ÅTERANVÄNDBAR KOD Pierre Setteskog, Pontus Munck
UTVECKLING MED RAMVERKET.NET Marcus Medina. Dagens visdomsord ” Oavsett om du tror att du kan, eller om du tror att du inte kan, har du helt rätt. ” -
Föreläsning 4 Klasser Och Objekt.
UTVECKLING MED RAMVERKET.NET Marcus Medina. Dagens visdomsord ”Google is your friend”
DATABASHANTERING för programmerare Lektion 5 Mahmud Al Hakim
Det är en exempel av framtidens datorer men före jag riktigt går in på det ska jag berätta om för i tidens datorer! Framtidens Datorer!
Informatik C VT 2010 Informationssökning Magnus Olsson, Umeå UB Tel
Övning2 programmeringsteknik och Matlab 2D1312/ 2D1305
Procedurellt potpurri Dagens samtalsämnen –Klipp (Cut) –If-then-else –fail/0 –repeat/0 Att läsa –The Art of Prolog, kapitel 11 –Relevant avsnitt i Learn.
Föreläsning 5 Klasser och instanser
William Sandqvist Funktionsbibliotek När man utvecklat en funktion så långt att den är "färdigutvecklad" kan man lika gärna spara den på.
För utveckling av verksamhet, produkter och livskvalitet. Algoritmer och Datastrukturer -- Kap 21,14 Prioritets Köer (Priority Queues ), Graph.
DA7351 Programmering 1 Databas SQL Föreläsning 24.
1-1 Copyright © 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley 1-1 Programmering 7.5 hp Programmering är... creativ, fascinerande, roligt,
Lab Contact 1  Lab Assistants:  Meng Liu, Group B  Sara Abbaspour, Group A
 Object-Relational mapping  (aka O/RM, ORM, and O/R mapping)  Mappning av objekt och dess relationer till/från en relationsdatabas.
TDP004 Objektorienterad Programmering Fö 5 Minneshantering.
This is a lie 404 Web page does not exist.
This is a lie 404 Web page does not exist.
IT Databas Göran Wiréen
Föreläsning 3: Booleans, if, switch
Föreläsning 8: Exempel och problemlösning
Den Förlåtande Databasen SQLUG
Presentationens avskrift:

NHibernate i praktiken Vittnesbörd från en användare

Min bakgrund Objektorientering (OO) sedan 1985 SQL sedan % från Domain Model (DM), 50 % från databas (DB) Gör DB-schemat för hand Har skrivit egen Object/Relational-mapper (O/R- mapper) –För Delphi, 1995

Användare Ej dykt i NH-koden –Skönt att bara använda ibland Inte speciellt avancerad POCO (Plain Old CLR Object) Vill prata om helheten i ett POCO och TDD scenario

O/R-mappning i ett nötskal Objekts fält –Ta (utvalda) fält och lagra i kolumner på en rad i en tabell Objekts relationer –en-till-en –en-till-många –många-till-många –arv (inte idag)

Objekt- kontra databasidentitet Ett objekts identitet är dess ”adress” En rad i en databas identifieras med en PK I ett programs adressrymd så vill vi bara att ett objekt laddat från databasen ska förekomma en gång –Ok, adressrymd inom ett visst scope

NHibernate Session Databaskoppling Identity Map (kopplar samman identitet i minne och i databas) –En rad laddad bara en gång –Jämför på objekt istf fält – Unit of Work (vad ska göras mot databasen) –Vad ska göras mot databasen vid Flush – Webbapplikation i lastbalancerad farm – Session-handling-in-a-Web.htmhttp:// Session-handling-in-a-Web.htm

Domain Model Driver utveckling från DM –Test Driven Development (TDD) I största möjliga mån ovetande om lagring –Pragmatisk (Id + mappningsfil) –Abstraktion av lager eller tjänst

Exempel BookCopy ~= exemplar

Exempel Kort demo av app

Exempel

Persistence Data Access Objects (DAO) –BookDAO –BorrowerDAO –etc

WebGuiMdl

WebGuiMdlGlue [Serializable] public class BookListingMdl_Collab: BookListingMdl.Collab { public BookListingMdl_Collab(NHibernate.ISession s) { _s = s; } public IList GetBooks() { return new BookDAO(_s).FindAll(); } public int GetItemNumber() { return new ItemNumberHandlerDb().GetNumber(); } public IList GetAllAuthors() { return new AuthorDAO(_s).FindAll(); } public void MakePersistent(Book book) { new BookDAO(_s).MakePersistent(book); } public void MakeTransient(Book book) { new BookDAO(_s).MakeTransient(book); } public void PersistAll() { NHibUtil.PersistAll(_s); } NHibernate.ISession _s; }

Web app

Pekare BookCopy  Borrower –many-to-one mappning Samtidigt one-to-many åt andra hållet –Man kan skippa den ena eller andra sidan av relationen

Medlemsset Inga direkta publika set på klassen På klassen –ICollection –AddFoo –RemoveFoo –HasFoo –o dyl På Book public BookCopy AddBookCopy(int itemNumber) { BookCopy res = new BookCopy(this, itemNumber); _copies.Add(res); return res; } public ICollection BookCopies { get { return _copies; } Iesi.Collections.ISet _copies;

En till många Book  BookCopy –Composite aggregate –Book har livstidskontroll av BookCopy

Ta bort en bok Om boken har en kopia utlånad så vill vi förhindra borttaget. –En bok sopar alla sina kopior utan att upptäcka om en kopia är utlånad (BookCopy- rad pekar på låntagare) –Fixar vi med kod –Samtidighetsproblem fixar vi med koll i databasen  visas lite senare

Test mot databasen LendLibNUnit db för tester –LendLib db för appen SetUp –sproc NUnitSetup –Minimalt utgångsmaterial TearDown –sproc NUnitTeardown

Ta bort en bok [Test] public void DeleteBookWithBookCopyOut() { Borrower borrower = new BorrowerDAO(Session).FindByBorrowerId(1); Book b = dao.FindById(idBookBar); BorrowFirstCopy(b, borrower); // does not flush try { dao.MakeTransient(b); A.Fail("Should fail"); } catch(BookNotOkToDeleteException) {} } BookDAO public void MakeTransient(Book book) { if (!book.IsOkToDelete()) throw new BookNotOkToDeleteException(); base.MakeTransient(book); }

Många till många Author har skrivit många böcker –Vill du att en Author ska kunna tas bort om han ”står som författare” till någon bok? –Vill du att en Bok ska kunna tas bort som har författare? Kolla in vilken sida som du sätter inverse=true på –Bilden säger inverse=true på Book sidan Kombination av DM och db Skriv tester

Lazy Load Member-set Relationer och laddning av data Laddar när man petar på den –Se touch på.Count i test några bilder bort

Samtidighet Optimistisk med sen kontroll via versionsräknare Glöm inte bort databasens förmåga att upprätthålla constraints Simulerar samtidighet i test genom att använda två NH-sessioner

version [Test] public void DeleteBookWhenSomeoneAddsNewCopyBetweenReadAndDelete() { // User 1 Book b = dao.FindById(idBookBar); int c = b.BookCopies.Count; // touch lazy loaded collection using (NHibernate.ISession s = NHibUtil.CreateSession()) { // User 2 (in another session) Book b2 = new BookDAO(s).FindById(idBookBar); b2.AddBookCopy(1212); short oldCC = b2.CC; NHibUtil.PersistAll(s); A.AreEqual(oldCC+1, b2.CC); // this is actually enough to test... } // User 1 continues dao.MakeTransient(b); try { NHibUtil.PersistAll(Session); A.Fail("Should fail"); } catch(ChangedOrDeletedByOtherUserException) // StaleObjectStateException {} }

Ta bort en bok – lurigt fall [Test] public void DeleteBookWithBookCopyOutMultiUserSituationCaughtByDbFallback() { // User 1 Book b = dao.FindById(idBookBar); int c = b.BookCopies.Count; // touch lazy loaded collection using (NHibernate.ISession s = NHibUtil.CreateSession()) { // User 2 (in another session) Borrower borrower = new BorrowerDAO(s).FindByBorrowerId(1); Book b2 = new BookDAO(s).FindById(idBookBar); BorrowFirstCopy(b2, borrower); NHibUtil.PersistAll(s); } // User 1 continues dao.MakeTransient(b); try { NHibUtil.PersistAll(Session); A.Fail("Should fail"); } catch(NHibernate.ADOException ex) { // expecting the fallback to step in; a trigger checking delete of BookCopy if (ex.InnerException == null || ex.InnerException.Message != "Some bookcopy is not in library") throw; }

Ta bort en bok – lurigt fall create trigger BookCopyInLibraryCheck on BookCopy for delete as if exists(select * from deleted where refBorrower is not null) begin raiserror ('Some bookcopy is not in library', 11, 1) end

SQL-action Använd t.ex. SQL Server Profiler Skriv gärna utforskande NUnit-tester

Kan man glömma rdb:n med O/R? Jag tycker inte det –Jag har aldrig försökt –Kan inte gärna bortse från det jag råkar veta om rdb Man slipper skriva en massa kod som är i stort sett samma varje gång

Bara solsken? Inte riktigt nöjd med kasta session vid exception

Referenser och länkar –Gemensamt med Hibernate The Server Side – d=NHibernatehttp:// d=NHibernate – d=NHibernateP2http:// d=NHibernateP2 –Se upp med try-catch-hanteringen Boken Hibernate in Action av Bauer & King –Java

Ingo – Lib-dist ziphttp:// Lib-dist zip