Disclaimer, this answer is more related to the content discussed in here https://stackoverflow.com/a/29730411/1679310 (comments)
Let me provide you with more details, related to your mapping.
Firstly, reduce full names:
// here we have namespace, not needed below for classes, if is the same
<hibernate-mapping ... namespace="NhibernateTesting.Models" >
The original class mapping is commented, my approach is replacing it:
// <class name="NhibernateTesting.Models.ProductList" table="ProductList" lazy="false">
<class name="ProductList" table="ProductList"
lazy="true" // always use LAZY
batch-size="25" // optimization for loading - avoid 1 + N
>
//<id name="Id">
// <generator class="native" />
//</id>
// more readable version
<id name="Id" generator="native" />
// these are OK
<property name="Name" />
<property name="Owner" />
// collection should be ALWAYS lazy
// <bag name="Viewers" table="ProductListViewer" lazy="false">
// and also, optimization as batch size is needed
<bag name="Viewers" table="ProductListViewer"
lazy="true" // LAZY is must,
batch-size="25" cool optimization to avoid 1 + N
>
<key column="ProductListId" />
<element column="Username" type="System.String"/>
</bag>
// I would never use MANY-TO-MANY
// <bag name="Products" table="ProductListProductXRef" lazy="false" cascade="all" fetch="select">
<bag name="Products" table="ProductListProductXRef"
inverse="true" // in many to many only one side could be inverse
lazy="true"
cascade="none" // cascade here means, delete PRODUCTS
// not the pairing table, so I would expect that we need none
fetch="select">
<key column="ProductListId" />
// I would avoid many to many if possible
<many-to-many column="ProductId" class="NhibernateTesting.Models.Product" />
...
Check these links for more details.
Laziness
Batch fetching
Avoid many to many
When to use cascading
These would be my suggestions, which apply to all mappings.
In general this should be the class mapping
<class
name="ProductList"
table="ProductList"
lazy="true"
batch-size="25"
>
In case we need versioning:
<class
name="ProductList"
table="ProductList"
lazy="true"
batch-size="25"
optimistic-lock="version"
dynamic-update="true"
>
<version name="Timestamp" generated="always" unsaved-value="null" type="BinaryBlob">
<column name="RowVersion" not-null="false" sql-type="timestamp"/>
</version>
This should be the collection mapping:
<bag name="Items"
lazy="true"
inverse="true"
batch-size="25"
cascade="all-delete-orphan">
<key column="Item_ID" />
<one-to-many class="SomeItemClass"/>
</bag>