When building applications with Spring Boot and JPA (Java Persistence API), managing relationships between entities is crucial. Understanding how to map these relationships effectively will help you model your data accurately and perform efficient queries. In this guide, we'll explore the different types of JPA mappings supported by Spring Boot: one-to-one, one-to-many, many-to-one, and many-to-many. Will provide example on both unidirectional and bidirectional mappings.
One-to-One Relationship
Unidirectional One-to-One
In a unidirectional one-to-one relationship, one entity references another without the second entity knowing about the first.
Example:
// User.java
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToOne;
@Data
@Entity
public class User {
@Id
@GeneratedValue(stratergy = GenerationType.Identity)
private Long id;
private String username;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "fk_profile_id", referencedColumnName = "id")
private Profile profile;
}
// Profile.java
import javax.persistence.Entity;
import javax.persistence.Id;
@Data
@Entity
public class Profile {
@Id
@GeneratedValue(stratergy = GenerationType.Identity)
private Long id;
private String bio;
}
Bidirectional One-to-One
In a bidirectional one-to-one relationship, both entities reference to each other.
Example:
// User.java
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToOne;
@Data
@Entity
public class User {
@Id
@GeneratedValue(stratergy = GenerationType.Identity)
private Long id;
private String username;
@OneToOne(mappedBy = "user", cascade = CascadeType.ALL)
private Profile profile;
}
// Profile.java
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.JoinColumn;
@Data
@Entity
public class Profile {
@Id
@GeneratedValue(stratergy = GenerationType.Identity)
private Long id;
private String bio;
@OneToOne
@JoinColumn(name = "user_id")
private User user;
}
One-to-Many Relationship
Unidirectional One-to-Many
In a unidirectional one-to-many relationship, one entity references a collection of another entity.
Example:
// Author.java
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import java.util.List;
@Entity
@Data
public class Author {
@Id
@GeneratedValue(stratergy = GenerationType.Identity)
private Long id;
private String name;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "fk_book_id", referencedColumnName = "id")
private List<Book> books;
}
// Book.java
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
@Data
public class Book {
@Id
private Long id;
private String title;
}
Bidirectional One-to-Many
In a bidirectional one-to-many relationship, both entities are referenced to each other.
Example:
// Author.java
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.CascadeType;
import javax.persistence.FetchType;
import java.util.List;
@Entity
@Data
public class Author {
@Id
@GeneratedValue(stratergy = GenerationType.Identity)
private Long id;
private String name;
@OneToMany(mappedBy = "author", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private List<Book> books;
}
// Book.java
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
@Entity
@Data
public class Book {
@Id
@GeneratedValue(stratergy = GenerationType.Identity)
private Long id;
private String title;
@ManyToOne(name = "fk_author_id", referencedColumnName = "id")
private Author author;
}
Many-to-One Relationship
Unidirectional Many-to-One
In a unidirectional many-to-one relationship, multiple entities reference a single entity.
Example:
// Order.java
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
@Entity
@Data
public class Order {
@Id
@GeneratedValue(stratergy = GenerationType.Identity)
private Long id;
private String description;
@ManyToOne
private Customer customer;
}
// Customer.java
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
@Data
public class Customer {
@Id
@GeneratedValue(stratergy = GenerationType.Identity)
private Long id;
private String name;
}
Bidirectional Many-to-One
In a bidirectional many-to-one relationship, the referenced entity has a collection of the referring entities.
Example:
// Order.java
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
@Entity
@Data
public class Order {
@Id
@GeneratedValue(stratergy = GenerationType.Identity)
private Long id;
private String description;
@ManyToOne
private Customer customer;
}
// Customer.java
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import java.util.List;
@Entity
@Data
public class Customer {
@Id
@GeneratedValue(stratergy = GenerationType.Identity)
private Long id;
private String name;
@OneToMany(mappedBy = "customer")
private List<Order> orders;
}
Many-to-Many Relationship
Unidirectional Many-to-Many
In a unidirectional many-to-many relationship, each entity has a collection of the other, but the relationship is not explicitly managed by either side.
Example:
// Student.java
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import java.util.Set;
@Entity
@Data
public class Student {
@Id
@GeneratedValue(stratergy = GenerationType.Identity)
private Long id;
private String name;
@ManyToMany
private Set<Course> courses;
}
// Course.java
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import java.util.Set;
@Entity
@Data
public class Course {
@Id
@GeneratedValue(stratergy = GenerationType.Identity)
private Long id;
private String title;
@ManyToMany
private Set<Student> students;
}
Bidirectional Many-to-Many
In a bidirectional many-to-many relationship, both entities are referencing each other, and the relationship is explicitly managed.
Example:
// Student.java
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import java.util.Set;
@Entity
@Data
public class Student {
@Id
@GeneratedValue(stratergy = GenerationType.Identity)
private Long id;
private String name;
@ManyToMany(mappedBy = "students")
private Set<Course> courses;
}
// Course.java
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import java.util.Set;
@Entity
@Data
public class Course {
@Id
@GeneratedValue(stratergy = GenerationType.Identity)
private Long id;
private String title;
@ManyToMany
private Set<Student> students;
}
Top comments (0)