Partner – Orkes – NPI EA (cat=Spring)
announcement - icon

Modern software architecture is often broken. Slow delivery leads to missed opportunities, innovation is stalled due to architectural complexities, and engineering resources are exceedingly expensive.

Orkes is the leading workflow orchestration platform built to enable teams to transform the way they develop, connect, and deploy applications, microservices, AI agents, and more.

With Orkes Conductor managed through Orkes Cloud, developers can focus on building mission critical applications without worrying about infrastructure maintenance to meet goals and, simply put, taking new products live faster and reducing total cost of ownership.

Try a 14-Day Free Trial of Orkes Conductor today.

Partner – Orkes – NPI EA (tag=Microservices)
announcement - icon

Modern software architecture is often broken. Slow delivery leads to missed opportunities, innovation is stalled due to architectural complexities, and engineering resources are exceedingly expensive.

Orkes is the leading workflow orchestration platform built to enable teams to transform the way they develop, connect, and deploy applications, microservices, AI agents, and more.

With Orkes Conductor managed through Orkes Cloud, developers can focus on building mission critical applications without worrying about infrastructure maintenance to meet goals and, simply put, taking new products live faster and reducing total cost of ownership.

Try a 14-Day Free Trial of Orkes Conductor today.

eBook – Guide Spring Cloud – NPI EA (cat=Spring Cloud)
announcement - icon

Let's get started with a Microservice Architecture with Spring Cloud:

>> Join Pro and download the eBook

eBook – Mockito – NPI EA (tag = Mockito)
announcement - icon

Mocking is an essential part of unit testing, and the Mockito library makes it easy to write clean and intuitive unit tests for your Java code.

Get started with mocking and improve your application tests using our Mockito guide:

Download the eBook

eBook – Java Concurrency – NPI EA (cat=Java Concurrency)
announcement - icon

Handling concurrency in an application can be a tricky process with many potential pitfalls. A solid grasp of the fundamentals will go a long way to help minimize these issues.

Get started with understanding multi-threaded applications with our Java Concurrency guide:

>> Download the eBook

eBook – Reactive – NPI EA (cat=Reactive)
announcement - icon

Spring 5 added support for reactive programming with the Spring WebFlux module, which has been improved upon ever since. Get started with the Reactor project basics and reactive programming in Spring Boot:

>> Join Pro and download the eBook

eBook – Java Streams – NPI EA (cat=Java Streams)
announcement - icon

Since its introduction in Java 8, the Stream API has become a staple of Java development. The basic operations like iterating, filtering, mapping sequences of elements are deceptively simple to use.

But these can also be overused and fall into some common pitfalls.

To get a better understanding on how Streams work and how to combine them with other language features, check out our guide to Java Streams:

>> Join Pro and download the eBook

eBook – Jackson – NPI EA (cat=Jackson)
announcement - icon

Do JSON right with Jackson

Download the E-book

eBook – HTTP Client – NPI EA (cat=Http Client-Side)
announcement - icon

Get the most out of the Apache HTTP Client

Download the E-book

eBook – Maven – NPI EA (cat = Maven)
announcement - icon

Get Started with Apache Maven:

Download the E-book

eBook – Persistence – NPI EA (cat=Persistence)
announcement - icon

Working on getting your persistence layer right with Spring?

Explore the eBook

eBook – RwS – NPI EA (cat=Spring MVC)
announcement - icon

Building a REST API with Spring?

Download the E-book

Course – LS – NPI EA (cat=Jackson)
announcement - icon

Get started with Spring and Spring Boot, through the Learn Spring course:

>> LEARN SPRING
Course – RWSB – NPI EA (cat=REST)
announcement - icon

Explore Spring Boot 3 and Spring 6 in-depth through building a full REST API with the framework:

>> The New “REST With Spring Boot”

Course – LSS – NPI EA (cat=Spring Security)
announcement - icon

Yes, Spring Security can be complex, from the more advanced functionality within the Core to the deep OAuth support in the framework.

I built the security material as two full courses - Core and OAuth, to get practical with these more complex scenarios. We explore when and how to use each feature and code through it on the backing project.

You can explore the course here:

>> Learn Spring Security

Partner – LambdaTest – NPI EA (cat=Testing)
announcement - icon

Browser testing is essential if you have a website or web applications that users interact with. Manual testing can be very helpful to an extent, but given the multiple browsers available, not to mention versions and operating system, testing everything manually becomes time-consuming and repetitive.

To help automate this process, Selenium is a popular choice for developers, as an open-source tool with a large and active community. What's more, we can further scale our automation testing by running on theLambdaTest cloud-based testing platform.

Read more through our step-by-step tutorial on how to set up Selenium tests with Java and run them on LambdaTest:

>> Automated Browser Testing With Selenium

Partner – Orkes – NPI EA (cat=Java)
announcement - icon

Modern software architecture is often broken. Slow delivery leads to missed opportunities, innovation is stalled due to architectural complexities, and engineering resources are exceedingly expensive.

Orkes is the leading workflow orchestration platform built to enable teams to transform the way they develop, connect, and deploy applications, microservices, AI agents, and more.

With Orkes Conductor managed through Orkes Cloud, developers can focus on building mission critical applications without worrying about infrastructure maintenance to meet goals and, simply put, taking new products live faster and reducing total cost of ownership.

Try a 14-Day Free Trial of Orkes Conductor today.

Course – LSD – NPI EA (tag=Spring Data JPA)
announcement - icon

Spring Data JPA is a great way to handle the complexity of JPA with the powerful simplicity of Spring Boot.

Get started with Spring Data JPA through the guided reference course:

>> CHECK OUT THE COURSE

Partner – Moderne – NPI EA (cat=Spring Boot)
announcement - icon

Refactor Java code safely — and automatically — with OpenRewrite.

Refactoring big codebases by hand is slow, risky, and easy to put off. That’s where OpenRewrite comes in. The open-source framework for large-scale, automated code transformations helps teams modernize safely and consistently.

Each month, the creators and maintainers of OpenRewrite at Moderne run live, hands-on training sessions — one for newcomers and one for experienced users. You’ll see how recipes work, how to apply them across projects, and how to modernize code with confidence.

Join the next session, bring your questions, and learn how to automate the kind of work that usually eats your sprint time.

1. Overview

When building robust Java applications with PostgreSQL, handling unique identifiers is a fundamental requirement. Instead of relying on auto-incrementing numeric IDs, UUIDs (Universally Unique Identifiers) offer an excellent alternative, particularly in distributed systems.

Over time, generating UUIDs as primary keys has become quite common in Java applications. In this tutorial, we’ll explore how to persist UUIDs in PostgreSQL using JPA (Java Persistence API), focusing on practical implementation with a relatable example of managing users in an application.

2. Setting up PostgreSQL and JPA

Before diving into configuration details, let’s ensure our development environment is ready. First, we’ll need a PostgreSQL database. Then, we’ll set up our Spring Boot project with the necessary Maven dependencies and PostgreSQL-related properties for our application.

2.1. Maven Dependencies

To start using PostgreSQL, we’ll add the driver dependency to our pom.xml file:

<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <scope>runtime</scope>
</dependency>

This dependency adds the PostgreSQL JDBC driver, enabling our application to connect and communicate with the database. It ensures compatibility between our Java application and PostgreSQL.

Next, we’ll also need to add the the spring-data-jpa dependency:

<dependency>
   <groupId>org.springframework.data</groupId>
   <artifactId>spring-data-jpa</artifactId>
</dependency>

This dependency brings in Hibernate, Spring Data JPA, and other utilities that allow us to interact with relational databases using Object-Relational Mapping (ORM). It also simplifies common database operations without requiring custom SQL queries.

2.2. PostgreSQL Configuration

To configure the data source, let’s add the necessary properties to our application.properties file:

spring.datasource.url=jdbc:postgresql://localhost:5432/user_management
spring.datasource.username=username
spring.datasource.password=password
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

This configuration block helps our Spring Boot application connect to the PostgreSQL database by specifying the database details like URL, name, authentication credentials, and Hibernate settings.

3. Configuring JPA for UUIDs

Now that our development environment is ready, let’s focus on configuring JPA to handle UUIDs effectively. We’ll map a UUID column in PostgreSQL and integrate it with our JPA entity.

3.1. UUID Column in PostgreSQL

In PostgreSQL, the UUID type natively supports 128-bit universally unique identifiers, making it an excellent choice for ensuring unique primary keys, especially in distributed systems.

Considering the example of managing users in an application, let’s create a table named users where we leverage a UUID for the primary key:

CREATE TABLE users (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL UNIQUE
);

This structure ensures that each user has a globally unique identifier, eliminating the risk of key collisions across different systems. The gen_random_uuid() function generates a new random UUID for the id column by default whenever a record is inserted, simplifying the task of assigning unique primary keys.

3.2. Entity Class

Let’s now create a JPA entity to map rows from the users table:

@Entity
@Table(name = "users")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(columnDefinition = "uuid", updatable = false, nullable = false)
    private UUID id;

    @Column(nullable = false)
    private String username;

    @Column(nullable = false, unique = true)
    private String email;
    // Getters and Setters
}

Here, the id field is annotated with @Id and @GeneratedValue, indicating that it’s the primary key and its value will be automatically generated as a UUID. We also specifically declare this column as a uuid with the columnDefinition.

The username and email fields are mapped to their respective columns and marked as @Column. The email field is also marked as unique to ensure no duplicate email entries are allowed in the table.

3.3. Repository and Service Classes

Next, let’s implement a repository to interact with the database and a service layer to encapsulate business logic for managing the User entities.

The UserRepository will handle database operations:

public interface UserRepository extends JpaRepository<User, UUID> {
}

The UserRepository extends JpaRepository, providing built-in methods for common database operations such as saving, finding, and deleting entities.

The UserService provides business logic for managing users:

@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;

    public User createUser(String name, String email) {
        User user = new User();
        user.setName(name);
        user.setEmail(email);
        return userRepository.save(user);
    }

    public List<User> getAllUsers() {
        return userRepository.findAll();
    }

    public User getUserById(UUID id) {
        return userRepository.findById(id).orElse(null);
    }
}

The UserService encapsulates the business logic, interacting with the repository to handle user-related operations like saving new users and retrieving existing ones by their UUID.

4. Testing UUID Persistence

We’ll add and execute tests for the UserRepository to ensure proper functionality when persisting and retrieving users with UUIDs. We’ll also verify that the saved entity’s id is a valid UUID.

First, let’s add a test to save a user through UserRepository:

@DataJpaTest
public class UserRepositoryTest {

    @Autowired
    private UserRepository userRepository;

    @Test
    public void givenUserEntity_whenSaved_thenIdIsUUID() {
        // Create and save a User entity
        User user = new User();
        user.setName("Alice");
        user.setEmail("[email protected]");

        // Save the user to the database
        User savedUser = userRepository.save(user);

        // Verify the saved entity has a valid UUID
        assertThat(savedUser.getId()).isNotNull();
        assertThat(savedUser.getId()).isInstanceOf(UUID.class);
    }
}

Next, let’s add another test in the same class to retrieve a user by ID:

@Test
public void givenSavedUser_whenFindById_thenUserIsRetrieved() {
    // Save a user
    User user = new User();
    user.setName("Jane Smith");
    user.setEmail("[email protected]");
    User savedUser = userRepository.save(user);

    // Retrieve the user by ID
    Optional<User> retrievedUser = userRepository.findById(savedUser.getId());

    // Verify the user is retrieved correctly
    assertThat(retrievedUser).isPresent();
    assertThat(retrievedUser.get().getId()).isEqualTo(savedUser.getId());
    assertThat(retrievedUser.get().getName()).isEqualTo("Jane Smith");
    assertThat(retrievedUser.get().getEmail()).isEqualTo("[email protected]");
    // Verify the Id is UUID
    assertThat(retrievedUser.get().getId()).isNotNull();
    assertThat(retrievedUser.get().getId()).isInstanceOf(UUID.class);
}

With these tests in place, we’ve ensured that our application can reliably store and retrieve users with UUID-based primary keys, confirming the integration of JPA with PostgreSQL’s UUID functionality.

5. Conclusion

In this article, we covered the essential steps to persist UUIDs in PostgreSQL using JPA.

We began by setting up PostgreSQL and integrating JPA to establish a connection between the application and the database. Next, we configured JPA for UUID support by defining a UUID column in PostgreSQL and mapping it in the entity class as the primary key.

We then demonstrated how to store and retrieve UUIDs efficiently using JPA repositories. Finally, we validated the implementation by testing UUID persistence. All these steps ensure that the application remains scalable and secure, and that it adheres to modern best practices.

The code backing this article is available on GitHub. Once you're logged in as a Baeldung Pro Member, start learning and coding on the project.
Baeldung Pro – NPI EA (cat = Baeldung)
announcement - icon

Baeldung Pro comes with both absolutely No-Ads as well as finally with Dark Mode, for a clean learning experience:

>> Explore a clean Baeldung

Once the early-adopter seats are all used, the price will go up and stay at $33/year.

Partner – Orkes – NPI EA (cat = Spring)
announcement - icon

Modern software architecture is often broken. Slow delivery leads to missed opportunities, innovation is stalled due to architectural complexities, and engineering resources are exceedingly expensive.

Orkes is the leading workflow orchestration platform built to enable teams to transform the way they develop, connect, and deploy applications, microservices, AI agents, and more.

With Orkes Conductor managed through Orkes Cloud, developers can focus on building mission critical applications without worrying about infrastructure maintenance to meet goals and, simply put, taking new products live faster and reducing total cost of ownership.

Try a 14-Day Free Trial of Orkes Conductor today.

Partner – Orkes – NPI EA (tag = Microservices)
announcement - icon

Modern software architecture is often broken. Slow delivery leads to missed opportunities, innovation is stalled due to architectural complexities, and engineering resources are exceedingly expensive.

Orkes is the leading workflow orchestration platform built to enable teams to transform the way they develop, connect, and deploy applications, microservices, AI agents, and more.

With Orkes Conductor managed through Orkes Cloud, developers can focus on building mission critical applications without worrying about infrastructure maintenance to meet goals and, simply put, taking new products live faster and reducing total cost of ownership.

Try a 14-Day Free Trial of Orkes Conductor today.

eBook – HTTP Client – NPI EA (cat=HTTP Client-Side)
announcement - icon

The Apache HTTP Client is a very robust library, suitable for both simple and advanced use cases when testing HTTP endpoints. Check out our guide covering basic request and response handling, as well as security, cookies, timeouts, and more:

>> Download the eBook

eBook – Java Concurrency – NPI EA (cat=Java Concurrency)
announcement - icon

Handling concurrency in an application can be a tricky process with many potential pitfalls. A solid grasp of the fundamentals will go a long way to help minimize these issues.

Get started with understanding multi-threaded applications with our Java Concurrency guide:

>> Download the eBook

eBook – Java Streams – NPI EA (cat=Java Streams)
announcement - icon

Since its introduction in Java 8, the Stream API has become a staple of Java development. The basic operations like iterating, filtering, mapping sequences of elements are deceptively simple to use.

But these can also be overused and fall into some common pitfalls.

To get a better understanding on how Streams work and how to combine them with other language features, check out our guide to Java Streams:

>> Join Pro and download the eBook

eBook – Persistence – NPI EA (cat=Persistence)
announcement - icon

Working on getting your persistence layer right with Spring?

Explore the eBook

Course – LS – NPI EA (cat=REST)

announcement - icon

Get started with Spring Boot and with core Spring, through the Learn Spring course:

>> CHECK OUT THE COURSE

Partner – Moderne – NPI EA (tag=Refactoring)
announcement - icon

Modern Java teams move fast — but codebases don’t always keep up. Frameworks change, dependencies drift, and tech debt builds until it starts to drag on delivery. OpenRewrite was built to fix that: an open-source refactoring engine that automates repetitive code changes while keeping developer intent intact.

The monthly training series, led by the creators and maintainers of OpenRewrite at Moderne, walks through real-world migrations and modernization patterns. Whether you’re new to recipes or ready to write your own, you’ll learn practical ways to refactor safely and at scale.

If you’ve ever wished refactoring felt as natural — and as fast — as writing code, this is a good place to start.

Course – LSD – NPI (cat=JPA)
announcement - icon

Get started with Spring Data JPA through the reference Learn Spring Data JPA:

>> CHECK OUT THE COURSE

eBook Jackson – NPI EA – 3 (cat = Jackson)