Suppose we start with a simple <one-to-many> association from Parent to Child.
Code:
<set name="children">
<key column="parent_id"/>
<one-to-many class="Child"/>
</set>
If we were to execute the following code:
Code:
Parent p = .....;
Child c = new Child();
p.getChildren().add(c);
session.save(c);
session.flush();
Hibernate would issue two SQL statements:
• an INSERT to create the record for c
• an UPDATE to create the link from p to c
This is not only inefficient, but also violates any NOT NULL constraint on the parent_id column.
You can fix the nullability constraint violation by specifying not-null="true" in the collection
mapping:
Code:
<set name="children">
<key column="parent_id" not-null="true"/>
<one-to-many class="Child"/>
</set>
However, this is not the recommended solution.
The underlying cause of this behavior is that the link (the foreign key parent_id) from p to c is
not considered part of the state of the Child object and is therefore not created in the INSERT.
The solution is to make the link part of the Child mapping.
Code:
<many-to-one name="parent" column="parent_id" not-null="true"/>
You also need to add the parent property to the Child class.
The problem mentioned above should be true in any circumstances. Then there is no point of the use of unidirectional one-to-many association in circumstances. But there are still many instances of unidirectional association mapping in chapter 7. Why did not they mention that this is not recommended (in chapter 7 when they were discussing unidirectional stuffs)?