Jump into concepts and practice - no test required
or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Create a @OneToOne Relationship in Spring Boot
📖 Scenario: You are building a simple Spring Boot application to manage users and their profiles. Each user has exactly one profile, and each profile belongs to exactly one user.
🎯 Goal: Build two entity classes User and UserProfile with a @OneToOne relationship between them using Spring Boot and JPA annotations.
📋 What You'll Learn
Create a User entity with fields id and username
Create a UserProfile entity with fields id and bio
Add a @OneToOne relationship from User to UserProfile
Use @JoinColumn to specify the foreign key column in User
Ensure the code compiles and follows Spring Boot JPA entity conventions
💡 Why This Matters
🌍 Real World
One-to-one relationships are common in applications where two entities have a direct and exclusive link, such as a user and their profile, or a person and their passport.
💼 Career
Understanding how to model and implement @OneToOne relationships is essential for backend developers working with Spring Boot and JPA to build relational data models.
Progress0 / 4 steps
1
Create the User entity
Create a class called User annotated with @Entity. Add private fields Long id annotated with @Id and @GeneratedValue, and String username. Add public getters and setters for both fields.
Spring Boot
Hint
Use @Entity on the class. Use @Id and @GeneratedValue(strategy = GenerationType.IDENTITY) on the id field.
2
Create the UserProfile entity
Create a class called UserProfile annotated with @Entity. Add private fields Long id annotated with @Id and @GeneratedValue, and String bio. Add public getters and setters for both fields.
Spring Boot
Hint
Use @Entity on the class. Use @Id and @GeneratedValue(strategy = GenerationType.IDENTITY) on the id field.
3
Add @OneToOne relationship in User
In the User class, add a private field UserProfile profile annotated with @OneToOne and @JoinColumn(name = "profile_id"). Add public getter and setter for profile.
Spring Boot
Hint
Use @OneToOne and @JoinColumn(name = "profile_id") on the profile field in User.
4
Complete the @OneToOne relationship setup
Ensure both User and UserProfile classes are in the same package and properly imported. Add @Entity annotations and all necessary imports. Confirm the code compiles without errors.
Spring Boot
Hint
Make sure all imports and annotations are present and both classes are complete.
Practice
(1/5)
1. What does the @OneToOne annotation represent in Spring Boot JPA?
easy
A. A relationship where one entity is linked to exactly one other entity
B. A relationship where one entity is linked to many entities
C. A relationship where many entities are linked to many entities
D. A relationship where entities are not linked at all
Solution
Step 1: Understand the meaning of @OneToOne
The @OneToOne annotation defines a direct one-to-one link between two entities in JPA.
Step 2: Compare with other relationship types
Unlike @OneToMany or @ManyToMany, @OneToOne means exactly one entity matches exactly one other entity.
Final Answer:
A relationship where one entity is linked to exactly one other entity -> Option A
Quick Check:
@OneToOne = one-to-one link [OK]
Hint: One entity matches exactly one other entity [OK]
Common Mistakes:
Confusing @OneToOne with @OneToMany
Thinking it allows multiple linked entities
Ignoring the uniqueness of the relationship
2. Which annotation is used on the owning side of a @OneToOne relationship to specify the foreign key column?
easy
A. @MappedBy
B. @Column
C. @JoinColumn
D. @Entity
Solution
Step 1: Identify the owning side annotation
The owning side uses @JoinColumn to specify the foreign key column in the database.
Step 2: Differentiate from mappedBy
@MappedBy is used on the inverse side, not the owning side.
Final Answer:
@JoinColumn -> Option C
Quick Check:
Owning side uses @JoinColumn [OK]
Hint: Owning side uses @JoinColumn for foreign key [OK]
Common Mistakes:
Using @MappedBy on owning side
Confusing @Column with @JoinColumn
Forgetting to specify @JoinColumn
3. Given the following code snippet, what will be the output when fetching Person and accessing person.getPassport().getNumber()?
@Entity
class Person {
@Id
private Long id;
@OneToOne
@JoinColumn(name = "passport_id")
private Passport passport;
// getters and setters
}
@Entity
class Passport {
@Id
private Long id;
private String number;
// getters and setters
}
medium
A. Throws NullPointerException because passport is not initialized
B. Returns the passport number linked to the person
C. Returns null because @OneToOne is missing mappedBy
D. Compilation error due to missing @MappedBy
Solution
Step 1: Analyze the @OneToOne mapping
The Person entity owns the relationship with @JoinColumn, so passport is linked properly.
Step 2: Understand the data fetching
When fetching Person, accessing person.getPassport().getNumber() returns the linked Passport's number if data exists.
Final Answer:
Returns the passport number linked to the person -> Option B
Quick Check:
Proper @OneToOne with @JoinColumn returns linked entity [OK]
Hint: Owning side with @JoinColumn returns linked entity [OK]
Common Mistakes:
Assuming mappedBy is required on owning side
Expecting NullPointerException without data check
Confusing compilation errors with runtime behavior
4. Identify the error in this @OneToOne mapping:
@Entity
class User {
@Id
private Long id;
@OneToOne(mappedBy = "user")
private Profile profile;
}
@Entity
class Profile {
@Id
private Long id;
@OneToOne
private User user;
}
medium
A. Missing @JoinColumn on Profile entity owning side
B. mappedBy should be on Profile, not User
C. User entity should not have @OneToOne annotation
D. Profile entity must use mappedBy instead of @OneToOne
Solution
Step 1: Check owning side annotations
Profile is the owning side but lacks @JoinColumn to specify the foreign key.
Step 2: Understand mappedBy usage
mappedBy is correctly on User side, indicating inverse side.
Final Answer:
Missing @JoinColumn on Profile entity owning side -> Option A
Quick Check:
Owning side needs @JoinColumn [OK]
Hint: Owning side must have @JoinColumn [OK]
Common Mistakes:
Placing mappedBy on owning side
Omitting @JoinColumn on owning side
Confusing owning and inverse sides
5. You want to create a bidirectional @OneToOne relationship between Employee and Desk. Which is the correct way to define the relationship so that Employee owns the relationship and the foreign key is in the Desk table?
hard
A. In Employee: @OneToOne(mappedBy = "desk") Desk desk; In Desk: @OneToOne @JoinColumn Employee employee;
B. In Employee: @OneToOne @JoinColumn Desk desk; In Desk: @OneToOne(mappedBy = "desk") Employee employee;
C. ;eeyolpme eeyolpmE nmuloCnioJ@ enOoTenO@ :kseD nI ;ksed kseD )"eeyolpme" = yBdeppam(enOoTenO@ :eeyolpmE nI
D. In Employee: @OneToOne(mappedBy = "employee") Desk desk; In Desk: @OneToOne @JoinColumn Employee employee;
Solution
Step 1: Determine owning side and foreign key location
The foreign key is in Desk table, so Desk owns the relationship.
Step 2: Correct annotation placement
Desk must have @JoinColumn and no mappedBy; Employee uses mappedBy to point to Desk's field.
Step 3: Match option with correct annotations
In Employee: @OneToOne(mappedBy = "employee") Desk desk; In Desk: @OneToOne @JoinColumn Employee employee; matches this.
Final Answer:
In Employee: @OneToOne(mappedBy = "employee") Desk desk; In Desk: @OneToOne @JoinColumn Employee employee; -> Option D
Quick Check:
Foreign key side owns with @JoinColumn, other side uses mappedBy [OK]
Hint: Foreign key side owns with @JoinColumn, other side uses mappedBy [OK]