I am making a couple of assumptions here. I am assuming that you have both a Produt class and a Category class and that the Product class has a property that encapsulates a Category. I am also assuming that the CategoryName in the database never actually changes, just the CategoryName of the in-memory Category instance.
It looks like you are not saving the category object. You have the code:
Code:
_session.SaveOrUpdate(product);
This only saves the values contained in the Product you create, not the associated Category. Since you are not changing any of the Product values in the code provided, you should be able to change the above code to...
Code:
_session.SaveOrUpdate(product.Category);
...and the category name should be persisted to the database.
I am guessing what is happening is that the Category object with the changed name is only changed in the session. This means that the Category will apear to have it's name changed for every future read of that Category made from that session. This happens because the session is caching that instance and not reading from the database again. Once the session is disposed, that instance of the Category goes with it without ever being persisted to the database. So when a new session is created and the value is read from the database on the first read, you receive the old, unchanged database value.