Bird
Raised Fist0
Spring Bootframework~10 mins

@Id and @GeneratedValue for primary keys in Spring Boot - Step-by-Step Execution

Choose your learning style10 modes available

Start learning this pattern below

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
Concept Flow - @Id and @GeneratedValue for primary keys
Define Entity Class
Add @Id Annotation
Add @GeneratedValue Annotation
Save Entity Instance
Database Auto-generates Primary Key
Entity Saved with Unique ID
This flow shows how marking a field with @Id and @GeneratedValue lets Spring Boot auto-generate unique primary keys when saving entities.
Execution Sample
Spring Boot
import jakarta.persistence.*;

@Entity
public class User {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;
}
Defines a User entity with an auto-generated primary key 'id'.
Execution Table
StepActionEntity Field 'id' ValueDatabase Primary Key GenerationResult
1Create new User instancenullNo DB action yetUser object created with id=null
2Call save(user)1DB generates new id=1User saved with id=1
3Create another User instancenullNo DB action yetSecond User object created with id=null
4Call save(secondUser)2DB generates new id=2Second User saved with id=2
5Retrieve first User1No DB actionUser with id=1 retrieved
6Retrieve second User2No DB actionUser with id=2 retrieved
💡 Execution stops after saving and retrieving entities with auto-generated primary keys.
Variable Tracker
VariableStartAfter Step 2After Step 4Final
user.idnull111
secondUser.idnullnull22
Key Moments - 3 Insights
Why is the 'id' field null before saving the entity?
Because the database generates the primary key only when the entity is saved, as shown in execution_table step 2.
What does @GeneratedValue(strategy = GenerationType.IDENTITY) do?
It tells Spring Boot to let the database auto-generate a unique primary key when saving, as seen in the DB generating ids 1 and 2 in steps 2 and 4.
Can we manually set the 'id' value when using @GeneratedValue?
Usually no, because the database controls the id generation to avoid duplicates, so the id is null before saving and assigned after.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what is the value of 'user.id' after step 2?
A0
Bnull
C1
Dundefined
💡 Hint
Check the 'Entity Field id Value' column at step 2 in the execution_table.
At which step does the database generate the primary key for the second user?
AStep 4
BStep 3
CStep 5
DStep 6
💡 Hint
Look at the 'Database Primary Key Generation' column for the second user in the execution_table.
If we remove @GeneratedValue, what would happen to the 'id' field before saving?
AIt would still be auto-generated by the database
BIt would remain null unless manually set
CIt would cause a compile error
DIt would automatically be set to 0
💡 Hint
Think about who assigns the id when @GeneratedValue is missing, referencing variable_tracker.
Concept Snapshot
@Id marks the primary key field in an entity.
@GeneratedValue tells Spring Boot to auto-generate this key.
Common strategy: GenerationType.IDENTITY uses DB auto-increment.
Before saving, id is null; after saving, id is assigned.
This ensures unique IDs without manual input.
Full Transcript
In Spring Boot, the @Id annotation marks a field as the primary key of an entity. The @GeneratedValue annotation instructs the framework to let the database generate a unique primary key automatically when the entity is saved. Typically, the GenerationType.IDENTITY strategy is used, which relies on the database's auto-increment feature. When a new entity instance is created, its id field is null. Upon saving, the database assigns a unique id, which is then set back into the entity. This process avoids manual id management and ensures unique primary keys for each saved entity.

Practice

(1/5)
1. What is the main purpose of the @Id annotation in a Spring Boot entity?
easy
A. To specify a foreign key relationship
B. To generate unique values automatically
C. To define a database table name
D. To mark the primary key field of the entity

Solution

  1. Step 1: Understand the role of @Id

    The @Id annotation marks a field as the primary key in a database entity.
  2. Step 2: Differentiate from other annotations

    @GeneratedValue generates values, but @Id specifically identifies the primary key field.
  3. Final Answer:

    To mark the primary key field of the entity -> Option D
  4. Quick Check:

    @Id marks primary key [OK]
Hint: Remember: @Id means 'this is the primary key' [OK]
Common Mistakes:
  • Confusing @Id with @GeneratedValue
  • Thinking @Id generates values automatically
  • Using @Id to name tables
2. Which of the following is the correct way to use @GeneratedValue with GenerationType.IDENTITY in a Spring Boot entity?
easy
A. @GeneratedValue(strategy = GenerationType.AUTO)
B. @GeneratedValue(strategy = GenerationType.SEQUENCE)
C. @GeneratedValue(strategy = GenerationType.IDENTITY)
D. @GeneratedValue(strategy = GenerationType.TABLE)

Solution

  1. Step 1: Identify the correct strategy for identity generation

    GenerationType.IDENTITY is used to let the database auto-increment the primary key.
  2. Step 2: Match the annotation syntax

    The correct syntax is @GeneratedValue(strategy = GenerationType.IDENTITY).
  3. Final Answer:

    @GeneratedValue(strategy = GenerationType.IDENTITY) -> Option C
  4. Quick Check:

    Use GenerationType.IDENTITY with strategy = GenerationType.IDENTITY [OK]
Hint: Use strategy = GenerationType.IDENTITY for auto-increment keys [OK]
Common Mistakes:
  • Using AUTO instead of IDENTITY for auto-increment
  • Omitting the strategy parameter
  • Confusing SEQUENCE with IDENTITY
3. Given the entity code below, what will be the value of user.getId() after saving a new user to the database?
 @Entity
 public class User {
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private Long id;
   private String name;

   // getters and setters
 }
medium
A. A unique auto-generated Long value
B. null
C. The name of the user
D. An exception will be thrown

Solution

  1. Step 1: Understand @GeneratedValue with IDENTITY

    This strategy lets the database generate a unique primary key value automatically when saving.
  2. Step 2: Predict the value after saving

    After saving, user.getId() will hold the generated unique Long value assigned by the database.
  3. Final Answer:

    A unique auto-generated Long value -> Option A
  4. Quick Check:

    @GeneratedValue with IDENTITY creates unique IDs [OK]
Hint: After save, IDENTITY generates a unique Long ID automatically [OK]
Common Mistakes:
  • Expecting id to be null after save
  • Confusing id with other fields
  • Assuming an error occurs without database setup
4. Consider this entity code snippet:
 @Entity
 public class Product {
   @Id
   @GeneratedValue
   private Long productId;

   private String name;
 }

What is the likely problem with this code?
medium
A. Missing strategy in @GeneratedValue may cause unexpected ID generation
B. The field productId should not be private
C. The @Id annotation is missing
D. The entity class must implement Serializable

Solution

  1. Step 1: Check @GeneratedValue usage

    The @GeneratedValue annotation without specifying a strategy defaults to AUTO, which may behave differently depending on the database.
  2. Step 2: Understand impact of missing strategy

    This can cause unexpected ID generation behavior if the database does not support the default strategy well.
  3. Final Answer:

    Missing strategy in @GeneratedValue may cause unexpected ID generation -> Option A
  4. Quick Check:

    Always specify strategy to avoid surprises [OK]
Hint: Always specify strategy in @GeneratedValue to avoid surprises [OK]
Common Mistakes:
  • Thinking private fields cause errors
  • Believing @Id is missing
  • Assuming Serializable is mandatory
5. You want to create a Spring Boot entity with a primary key that uses a database sequence named user_seq. Which is the correct way to annotate the ID field?
hard
A. @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
B. @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_seq") @SequenceGenerator(name = "user_seq", sequenceName = "user_seq", allocationSize = 1)
C. @Id @GeneratedValue(strategy = GenerationType.TABLE)
D. @Id @GeneratedValue(strategy = GenerationType.AUTO)

Solution

  1. Step 1: Identify sequence generation requirements

    Using a database sequence requires GenerationType.SEQUENCE and a matching @SequenceGenerator annotation.
  2. Step 2: Match annotations to sequence name

    The @SequenceGenerator defines the sequence name and allocation size, linked by the generator name in @GeneratedValue.
  3. Final Answer:

    @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_seq") @SequenceGenerator(name = "user_seq", sequenceName = "user_seq", allocationSize = 1) -> Option B
  4. Quick Check:

    Use SEQUENCE with @SequenceGenerator for DB sequences [OK]
Hint: Use @SequenceGenerator with SEQUENCE strategy for DB sequences [OK]
Common Mistakes:
  • Using IDENTITY instead of SEQUENCE for sequences
  • Omitting @SequenceGenerator annotation
  • Confusing TABLE and AUTO strategies