Annotating Relationships in Hibernate 4
In Hibernate 4 and Spring, you can define various relationships between classes using annotations. The following outlines how to create one-to-one, one-to-many, many-to-one, and many-to-many relationships:
Uni-directional One-to-One Relationships:
- Use @OneToOne on the owning class (primary key of the owning class references the other class).
- No corresponding mapping required on the other class.
Bi-directional One-to-One Relationships:
- Use @OneToOne(mappedBy = "bar") on the owning class to indicate the relationship is managed by the other class.
- Use @OneToOne on the other class with mappedBy pointing to the owning class.
Uni-directional One-to-Many Relationships Using User Managed Join Table:
- Use @OneToMany on the owning class.
- Use @JoinTable to define the join table between the entities.
- No mapping required on the other class.
Bi-directional One-to-Many Relationship Using Foreign Key Mapping:
- Use @OneToMany(mappedBy = "bar") on the owning class.
- Use @ManyToOne on the other class with mappedBy pointing to the owning class.
Bi-directional Many-to-Many Using Hibernate Managed Join Table:
- Use @OneToMany on both classes to create a self-referencing relationship.
- Use @JoinTable to define the join table.
Bi-directional Many-to-Many Using User Managed Join Table Object:
- Use @OneToMany on both classes to create a self-referencing relationship.
- Define a separate class as the join table object.
Determining the "Owning" Side of Bi-directional Relationships:
- Typically, the class that has a collection of another class is considered the "owning" side.
- This determines where the foreign key is stored and which class manages the changes.
Selecting FetchType
- Lazy fetching (default) loads the related objects only when needed.
- Eager fetching (set fetchType = FetchType.EAGER) loads the related objects immediately.
Avoid LazyInitializationException by Using Hibernate.initialize() or FetchMode:
- Use Hibernate.initialize(person.getRoles()); to eagerly load a lazily fetched collection.
- Use setFetchMode("roles", FetchMode.SUBSELECT) on the criteria to eager load a collection.
Determining Cascade Direction:
- Use cascade to specify which operations (create, update, delete) cascade between the related entities.
- Set cascade both ways if required, but only if it makes sense semantically.
Orphan Removal:
- Enable orphanRemoval on @OneToMany to automatically delete orphaned entities (entities that are no longer referenced).
The above is the detailed content of How to Define Relationships in Hibernate 4 using Annotations?. For more information, please follow other related articles on the PHP Chinese website!