We use @Id to mark a field as the main identifier for a database record. @GeneratedValue helps create unique IDs automatically so we don't have to set them ourselves.
@Id and @GeneratedValue for primary keys in Spring Boot
Start learning this pattern below
Jump into concepts and practice - no test required
import jakarta.persistence.Entity; import jakarta.persistence.Id; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; @Entity public class EntityName { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; // other fields, getters, setters }
@Id marks the primary key field.
@GeneratedValue tells Spring Boot to generate the ID automatically. The strategy defines how IDs are created.
GenerationType.IDENTITY which lets the database handle ID generation, often using auto-increment.import jakarta.persistence.Entity; import jakarta.persistence.Id; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long userId; private String name; }
GenerationType.SEQUENCE which uses a database sequence to generate IDs, common in some databases like Oracle.import jakarta.persistence.Entity; import jakarta.persistence.Id; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; @Entity public class Product { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE) private Long productId; private String productName; }
GenerationType.AUTO lets Spring Boot pick the best strategy based on the database.import jakarta.persistence.Entity; import jakarta.persistence.Id; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; @Entity public class Order { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long orderId; private String orderDetails; }
This Spring Boot app defines a Person entity with @Id and @GeneratedValue. It saves a new person and prints the list before and after saving. The ID is generated automatically.
package com.example.demo; import jakarta.persistence.Entity; import jakarta.persistence.Id; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import org.springframework.beans.factory.annotation.Autowired; @Entity class Person { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String name; public Person() {} public Person(String name) { this.name = name; } public Long getId() { return id; } public String getName() { return name; } @Override public String toString() { return "Person{id=" + id + ", name='" + name + "'}"; } } @Repository interface PersonRepository extends JpaRepository<Person, Long> {} @SpringBootApplication public class DemoApplication implements CommandLineRunner { @Autowired private PersonRepository personRepository; public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } @Override public void run(String... args) throws Exception { System.out.println("Before saving:"); personRepository.findAll().forEach(System.out::println); Person newPerson = new Person("Alice"); personRepository.save(newPerson); System.out.println("After saving:"); personRepository.findAll().forEach(System.out::println); } }
Time complexity: Generating the ID is very fast and handled by the database or framework.
Space complexity: No extra space is needed beyond the entity object.
Common mistake: Forgetting to add @Id causes errors because the framework doesn't know the primary key.
Use @GeneratedValue when you want automatic unique IDs. If you want to set IDs manually, do not use it.
@Id marks the primary key field in an entity.
@GeneratedValue automatically creates unique IDs for new records.
Choosing the right GenerationType depends on your database and needs.
Practice
@Id annotation in a Spring Boot entity?Solution
Step 1: Understand the role of
The@Id@Idannotation marks a field as the primary key in a database entity.Step 2: Differentiate from other annotations
@GeneratedValuegenerates values, but@Idspecifically identifies the primary key field.Final Answer:
To mark the primary key field of the entity -> Option DQuick Check:
@Idmarks primary key [OK]
- Confusing @Id with @GeneratedValue
- Thinking @Id generates values automatically
- Using @Id to name tables
@GeneratedValue with GenerationType.IDENTITY in a Spring Boot entity?Solution
Step 1: Identify the correct strategy for identity generation
GenerationType.IDENTITYis used to let the database auto-increment the primary key.Step 2: Match the annotation syntax
The correct syntax is@GeneratedValue(strategy = GenerationType.IDENTITY).Final Answer:
@GeneratedValue(strategy = GenerationType.IDENTITY) -> Option CQuick Check:
Use GenerationType.IDENTITY with strategy = GenerationType.IDENTITY [OK]
- Using AUTO instead of IDENTITY for auto-increment
- Omitting the strategy parameter
- Confusing SEQUENCE with IDENTITY
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
}Solution
Step 1: Understand @GeneratedValue with IDENTITY
This strategy lets the database generate a unique primary key value automatically when saving.Step 2: Predict the value after saving
After saving,user.getId()will hold the generated unique Long value assigned by the database.Final Answer:
A unique auto-generated Long value -> Option AQuick Check:
@GeneratedValue with IDENTITY creates unique IDs [OK]
- Expecting id to be null after save
- Confusing id with other fields
- Assuming an error occurs without database setup
@Entity
public class Product {
@Id
@GeneratedValue
private Long productId;
private String name;
}What is the likely problem with this code?
Solution
Step 1: Check @GeneratedValue usage
The@GeneratedValueannotation without specifying a strategy defaults toAUTO, which may behave differently depending on the database.Step 2: Understand impact of missing strategy
This can cause unexpected ID generation behavior if the database does not support the default strategy well.Final Answer:
Missing strategy in @GeneratedValue may cause unexpected ID generation -> Option AQuick Check:
Always specify strategy to avoid surprises [OK]
- Thinking private fields cause errors
- Believing @Id is missing
- Assuming Serializable is mandatory
user_seq. Which is the correct way to annotate the ID field?Solution
Step 1: Identify sequence generation requirements
Using a database sequence requiresGenerationType.SEQUENCEand a matching@SequenceGeneratorannotation.Step 2: Match annotations to sequence name
The@SequenceGeneratordefines the sequence name and allocation size, linked by the generator name in@GeneratedValue.Final Answer:
@Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_seq") @SequenceGenerator(name = "user_seq", sequenceName = "user_seq", allocationSize = 1) -> Option BQuick Check:
Use SEQUENCE with @SequenceGenerator for DB sequences [OK]
- Using IDENTITY instead of SEQUENCE for sequences
- Omitting @SequenceGenerator annotation
- Confusing TABLE and AUTO strategies
