In Spring Boot (and the larger Spring Framework), the annotations @Entity, @Repository, and @Service play a key role in structuring and organizing applications using the principles of dependency injection and inversion of control. Here’s an overview of each:
1. @Entity
- Definition: The
@Entityannotation is used in Java Persistence API (JPA) to define a class as a persistent entity. This means the class maps to a table in the database. - Key Features:
- Marks a POJO (Plain Old Java Object) as a JPA entity.
- Each annotated class is associated with a database table, and each instance of the class represents a row in that table.
- Requires a primary key, typically annotated with
@Id.
- Example:
package org.kodejava.spring;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
@Entity
public class Employee {
@Id
private Long id;
private String name;
private String role;
// Getters and setters
}
- Usage Context: This annotation is part of Jakarta EE (or JPA) and is generally used for classes that model database tables.
2. @Repository
- Definition: The
@Repositoryannotation indicates that the class is a repository, which is responsible for interacting with the database. -
Key Features:
- Used for Data Access Objects (DAO).
- It helps encapsulate the interaction with the database from the rest of the application.
- It automatically translates exceptions thrown by the persistence layer into Spring’s unchecked exceptions (like
DataAccessException).
- Example:
package org.kodejava.spring;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Long> {
// Custom database queries (if needed)
}
- Usage Context: Typically,
@Repositoryis used to annotate interfaces or classes that handle data persistence, often enhanced by Spring Data JPA for reducing boilerplate code.
3. @Service
- Definition: The
@Serviceannotation marks a class as a business service that contains the application’s business logic. -
Key Features:
- Indicates that the class is a “service” component in the Service layer.
- Helps clearly separate business logic from other concerns, such as data persistence or presentation.
- Works in conjunction with
@Componentto allow dependency injection.
- Example:
package org.kodejava.spring;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class EmployeeService {
private final EmployeeRepository repository;
// Constructor injection of the repository
public EmployeeService(EmployeeRepository repository) {
this.repository = repository;
}
public List<Employee> getAllEmployees() {
return repository.findAll();
}
public Employee saveEmployee(Employee employee) {
return repository.save(employee);
}
}
- Usage Context: Typically used to encapsulate and reuse business logic.
Summary of Their Responsibilities in an Application Layer:
@Entity: Maps a Java class to a database table (used in the Data Model layer).@Repository: Handles database operations (typically at the Data Access layer).@Service: Contains business logic (used in the Service layer).
How These Work Together:
These annotations correspond to different tiers in a common layering structure of a Spring Boot application:
1. Entity: Represents data (e.g., Employee).
2. Repository: Provides the CRUD operations for entities using JPA (e.g., EmployeeRepository).
3. Service: Manages the application’s business logic and interactions (e.g., EmployeeService).
By using these annotations together, you achieve a clean separation of concerns, making the application easier to maintain, test, and scale.
