hibernate-012: Which Direction to Use for Each Relationship Type in Hibernate?

Which Direction to Use for Each Relationship Type in Hibernate?

Choosing unidirectional or bidirectional depends on:

  • How you query data.
  • Performance considerations.
  • Database design (avoiding unnecessary tables).

1️⃣ One-to-Many & Many-to-One

Relationship Type Recommended Direction Why?
One-to-Many (Unidirectional) Not recommended Creates an unnecessary join table.
One-to-Many (Bidirectional) Recommended Avoids a join table, allows querying in both directions.
Many-to-One (Unidirectional) Recommended Simpler, efficient for querying child-to-parent.

Best Practice:

  • Always use @ManyToOne with @JoinColumn (this is the owning side).
  • Use @OneToMany(mappedBy = "field") on the inverse side only if needed.

Example

<span>@Entity</span>
<span>public</span> <span>class</span> <span>Employee</span> <span>{</span>
<span>@ManyToOne</span>
<span>@JoinColumn</span><span>(</span><span>name</span> <span>=</span> <span>"department_id"</span><span>)</span> <span>// Foreign key stored in Employee</span>
<span>private</span> <span>Department</span> <span>department</span><span>;</span>
<span>}</span>
<span>@Entity</span>
<span>public</span> <span>class</span> <span>Department</span> <span>{</span>
<span>@OneToMany</span><span>(</span><span>mappedBy</span> <span>=</span> <span>"department"</span><span>)</span> <span>// Inverse side</span>
<span>private</span> <span>List</span><span><</span><span>Employee</span><span>></span> <span>employees</span><span>;</span>
<span>}</span>
<span>@Entity</span>
<span>public</span> <span>class</span> <span>Employee</span> <span>{</span>
    <span>@ManyToOne</span>
    <span>@JoinColumn</span><span>(</span><span>name</span> <span>=</span> <span>"department_id"</span><span>)</span> <span>//  Foreign key stored in Employee</span>
    <span>private</span> <span>Department</span> <span>department</span><span>;</span>
<span>}</span>

<span>@Entity</span>
<span>public</span> <span>class</span> <span>Department</span> <span>{</span>
    <span>@OneToMany</span><span>(</span><span>mappedBy</span> <span>=</span> <span>"department"</span><span>)</span> <span>//  Inverse side</span>
    <span>private</span> <span>List</span><span><</span><span>Employee</span><span>></span> <span>employees</span><span>;</span>
<span>}</span>
@Entity public class Employee { @ManyToOne @JoinColumn(name = "department_id") // Foreign key stored in Employee private Department department; } @Entity public class Department { @OneToMany(mappedBy = "department") // Inverse side private List<Employee> employees; }

Enter fullscreen mode Exit fullscreen mode

Why?

Using only @ManyToOne is efficient (no extra join table).

Using bidirectional makes sense if you need to access employees from a department.


2️⃣ One-to-One

Relationship Type Recommended Direction Why?
One-to-One (Unidirectional) Recommended Simple, only one entity holds the foreign key.
One-to-One (Bidirectional) Use if needed Needed if both entities must reference each other.

Best Practice:

  • Use Unidirectional @OneToOne unless both sides must reference each other.
  • If using Bidirectional @OneToOne, ensure the inverse side has mappedBy.

Example

<span>@Entity</span>
<span>public</span> <span>class</span> <span>User</span> <span>{</span>
<span>@OneToOne</span>
<span>@JoinColumn</span><span>(</span><span>name</span> <span>=</span> <span>"profile_id"</span><span>)</span> <span>// Foreign key in User</span>
<span>private</span> <span>Profile</span> <span>profile</span><span>;</span>
<span>}</span>
<span>@Entity</span>
<span>public</span> <span>class</span> <span>Profile</span> <span>{</span>
<span>@OneToOne</span><span>(</span><span>mappedBy</span> <span>=</span> <span>"profile"</span><span>)</span> <span>// Inverse side</span>
<span>private</span> <span>User</span> <span>user</span><span>;</span>
<span>}</span>
<span>@Entity</span>
<span>public</span> <span>class</span> <span>User</span> <span>{</span>
    <span>@OneToOne</span>
    <span>@JoinColumn</span><span>(</span><span>name</span> <span>=</span> <span>"profile_id"</span><span>)</span> <span>//  Foreign key in User</span>
    <span>private</span> <span>Profile</span> <span>profile</span><span>;</span>
<span>}</span>

<span>@Entity</span>
<span>public</span> <span>class</span> <span>Profile</span> <span>{</span>
    <span>@OneToOne</span><span>(</span><span>mappedBy</span> <span>=</span> <span>"profile"</span><span>)</span> <span>//  Inverse side</span>
    <span>private</span> <span>User</span> <span>user</span><span>;</span>
<span>}</span>
@Entity public class User { @OneToOne @JoinColumn(name = "profile_id") // Foreign key in User private Profile profile; } @Entity public class Profile { @OneToOne(mappedBy = "profile") // Inverse side private User user; }

Enter fullscreen mode Exit fullscreen mode

Why?

Unidirectional is simple and avoids redundancy.

Bidirectional is useful if you frequently query both ways.


3️⃣ Many-to-Many

Relationship Type Recommended Direction Why?
Many-to-Many (Unidirectional) Okay for simple use cases One side owns the join table, but the other cannot query back.
Many-to-Many (Bidirectional) Recommended Both entities can query each other efficiently.

Best Practice:

  • Use bidirectional @ManyToMany to allow querying both sides.
  • Place @JoinTable on the owning side, use mappedBy on the inverse side.

Example

<span>@Entity</span>
<span>public</span> <span>class</span> <span>Student</span> <span>{</span>
<span>@ManyToMany</span>
<span>@JoinTable</span><span>(</span>
<span>name</span> <span>=</span> <span>"student_course"</span><span>,</span>
<span>joinColumns</span> <span>=</span> <span>@JoinColumn</span><span>(</span><span>name</span> <span>=</span> <span>"student_id"</span><span>),</span>
<span>inverseJoinColumns</span> <span>=</span> <span>@JoinColumn</span><span>(</span><span>name</span> <span>=</span> <span>"course_id"</span><span>)</span>
<span>)</span>
<span>private</span> <span>List</span><span><</span><span>Course</span><span>></span> <span>courses</span><span>;</span>
<span>}</span>
<span>@Entity</span>
<span>public</span> <span>class</span> <span>Course</span> <span>{</span>
<span>@ManyToMany</span><span>(</span><span>mappedBy</span> <span>=</span> <span>"courses"</span><span>)</span> <span>// Inverse side</span>
<span>private</span> <span>List</span><span><</span><span>Student</span><span>></span> <span>students</span><span>;</span>
<span>}</span>
<span>@Entity</span>
<span>public</span> <span>class</span> <span>Student</span> <span>{</span>
    <span>@ManyToMany</span>
    <span>@JoinTable</span><span>(</span>
        <span>name</span> <span>=</span> <span>"student_course"</span><span>,</span>
        <span>joinColumns</span> <span>=</span> <span>@JoinColumn</span><span>(</span><span>name</span> <span>=</span> <span>"student_id"</span><span>),</span>
        <span>inverseJoinColumns</span> <span>=</span> <span>@JoinColumn</span><span>(</span><span>name</span> <span>=</span> <span>"course_id"</span><span>)</span>
    <span>)</span>
    <span>private</span> <span>List</span><span><</span><span>Course</span><span>></span> <span>courses</span><span>;</span>
<span>}</span>

<span>@Entity</span>
<span>public</span> <span>class</span> <span>Course</span> <span>{</span>
    <span>@ManyToMany</span><span>(</span><span>mappedBy</span> <span>=</span> <span>"courses"</span><span>)</span> <span>//  Inverse side</span>
    <span>private</span> <span>List</span><span><</span><span>Student</span><span>></span> <span>students</span><span>;</span>
<span>}</span>
@Entity public class Student { @ManyToMany @JoinTable( name = "student_course", joinColumns = @JoinColumn(name = "student_id"), inverseJoinColumns = @JoinColumn(name = "course_id") ) private List<Course> courses; } @Entity public class Course { @ManyToMany(mappedBy = "courses") // Inverse side private List<Student> students; }

Enter fullscreen mode Exit fullscreen mode

Why?

Unidirectional works, but bidirectional is better for querying both ways.

Avoids duplicate join tables.


Final Recommendations

Relationship Best Approach Why?
One-to-Many & Many-to-One Use @ManyToOne + @OneToMany(mappedBy) Efficient, avoids extra join tables.
One-to-One Use Unidirectional @OneToOne, bidirectional only if necessary Simple and avoids redundancy.
Many-to-Many Use Bidirectional @ManyToMany Allows querying both ways without duplicating join tables.

Best Practice: Keep it simple. Use bidirectional only if both sides need to query each other.

原文链接:hibernate-012: Which Direction to Use for Each Relationship Type in Hibernate?

© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享
We’d better struggle for the future rather than regret for the past.
如果后悔过去,不如奋斗将来
评论 抢沙发

请登录后发表评论

    暂无评论内容