webForumDet fria alternativet

Save funkar men inte Flush

5 svar · 351 visningar · startad av freguz

freguzMedlem sedan feb. 2005280 inlägg
#1

Har stött på lite patrull i mitt NHibernate:ande

Har mappat en klass och allt funkar med Load och Save, men Flushen vill sig inte riktigt ....

Det är ett gäng vanliga sträng-properties i klassen, men Id är en Int32 och generator modell "native" (det är en vanlig auto increment primary key i tabellen)

Om jag Loadar mitt objekt, borde det inte gå att direkt manipulera objektegenskaper (utom Id), och sen genast köra en Flush(); ?

Även om jag skapar en new och sen kör Save() så funkar det fint med increment osv, så allt verkar ju i sin ordning.... kan man tycka :q

Mappning

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
	<class name="plan9_CSharp.Melodifest, plan9_CSharp" table="Melodifest">
		<id name="Id" type="Int32">
			<generator class="native" />
		</id>
		<property name="Name" type="String" length="100"/>
		<property name="Description" type="String" length="1000"/>
		<property name="Song_1" type="String" length="100"/>
		<property name="Song_2" type="String" length="100"/>
		<property name="Song_3" type="String" length="100"/>
		<property name="Song_4" type="String" length="100"/>
		<property name="Song_5" type="String" length="100"/>
		<property name="Song_6" type="String" length="100"/>
		<property name="Song_7" type="String" length="100"/>
		<property name="Song_8" type="String" length="100"/>
		<property name="DateStartVote" column="DateStart" type="DateTime" />
		<property name="DateStopVote" column="DateStop" type="DateTime" />
		<property name="RuleId" type="Int32"/>
		<property name="Winners_A" type="String"/>
		<property name="Winners_B" type="String"/>
	</class>
</hibernate-mapping>

Lite kod

NHibernate.Cfg.Configuration cfg = new NHibernate.Cfg.Configuration();
cfg.AddAssembly("plan9_CSharp");

ISessionFactory factory = cfg.BuildSessionFactory();
ISession session = factory.OpenSession();
ITransaction transaction = session.BeginTransaction();

M = (Melodifest)session.Load(typeof(Melodifest),int.Parse(ddl_songs.SelectedItem.Value));
M.Name = Name.Text;
M.DateStopVote = DateTime.Parse(DateStop.Text);
M.DateStartVote = DateTime.Parse(DateStart.Text);
M.RuleId = int.Parse(ddl_pointssystem.SelectedItem.Value);
M.Description = Description.Text;
						
M.Song_1 = Song1.Text;
M.Song_2 = Song2.Text;
M.Song_3 = Song3.Text;
M.Song_4 = Song4.Text;
M.Song_5 = Song5.Text;
M.Song_6 = Song6.Text;
M.Song_7 = Song7.Text;
M.Song_8 = Song8.Text;
M.Winners_A = Winners_A.Text.Replace(" ", "").Trim(',');
M.Winners_B = Winners_B.Text.Replace(" ", "").Trim(',');
session.Flush(); // <---------------- funkar ej
session.Close();
NickemannenMedlem sedan aug. 20003 575 inlägg
#2

session.SaveOrUpdate(M);
eller
session.Update(M);

freguzMedlem sedan feb. 2005280 inlägg
#3

Ok, tack, men borde inte Flush() funka egentligen? Jag vill ju gärna veta vilka kriterier det är för Flush

NickemannenMedlem sedan aug. 20003 575 inlägg
#4

Det Flush gör är att synkronisera allting med databasen.
Så du måste först göra Save/Update eller SaveOrUpdate och sedan Flush, men jag rekommenderar att du gör dina förändringar i en transaction t.ex.

using(ITransaction transaction = session.BeginTransaction())
{
try
{
ändringar bla bla
session.save(...)

transaction.commit();
}
catch(Exception)
{
transaction.rollback();
throw;
}
}
freguzMedlem sedan feb. 2005280 inlägg
#5

Ja det funkar säkert utmärkt :)
Men det jag egentligen undrar över är varför deras tutorial-kod funkar (som jag själv bygg o testat) men inte min...

hibernate.org

// open another session to retrieve the just inserted user
session = factory.OpenSession();

User joeCool = (User)session.Load(typeof(User), "joe_cool");

//The User object you get back is live! Change its properties and it will get persisted to the database on next Flush(). 

// set Joe Cool's Last Login property
joeCool.LastLogon = DateTime.Now;

// flush the changes from the Session to the Database
session.Flush();
NickemannenMedlem sedan aug. 20003 575 inlägg
#6

Hmm, det har du rätt i.

Prova att byta ut native till identity i mappningen.

Kolla på punkt 5.1.4.1. generator
http://www.hibernate.org/hib_docs/nhibernate/html/mapping.html

140 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
136 ms — hämta tråd, inlägg och bilagor (db)