Spring JPA repository: prevent update on save

spring data jpa save or update example
jpa save not working
spring data jpa partial update
jpa repository update method example
jparepository update if exists
jpa repository update one field
spring data jpa update multiple rows
update multiple columns in spring data jpa

My user DB table looks like this:

CREATE TABLE user (
    username VARCHAR(32) PRIMARY KEY,
    first_name VARCHAR(256) NOT NULL,
    last_name VARCHAR(256) NOT NULL,
    password VARCHAR(32) NOT NULL,
    enabled BOOL
) ENGINE = InnoDB;

This is the field definitions of my entity:

@Entity
public class User implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(nullable = false)
    private String username;

    @Column(nullable = false)
    private String firstName;

    @Column(nullable = false)
    private String lastName;

    @Column(nullable = false)
    private String password;

The field username is the key of my table/entity and it's up to me to set its value. When I need to create another user, I do this in my service:

public User insertUserImpl(String username, String firstName, String lastName) {
    Assert.hasText(username);
    Assert.hasText(firstName);
    Assert.hasText(lastName);

    String password = UUID.randomUUID().toString().substring(0, 4); // temp
    User user = new User(username, password);
    user.setFirstName(firstName);
    user.setLastName(lastName);
    user.setEnabled(false);
    this.userRepository.save(user);
    // FIXME - assegnare un ruolo
    return user;
}

Anyway, if the username is already taken, the repository just do an update, because the specified identifier is not null. This is not the behaviour that I want, I need it to throw something like a duplicate entry exception. Is there any way to prevent it? Do I have to do it by myself? E.g.:

User user = this.userRepository.findOne(username);
if(user != null) {
    throw new RuntimeException("Username already taken"); // FIXME - eccezione applicativa
}

How do I update an entity using spring-data-jpa?, What is difference between hibernate save () Saveorupdate () and persist () methods? In this article, I’m going to show you how the JPA persist and merge work and how do they compare with the Hibernate save, update, and saveOrUpdate methods. Although you should favor the JPA-based entity state transition methods, you are going to see that the Hibernate-specific update is actually a good alternative to merge when you want to

Instead of this.userRepository.save(user) , can you try this.userRepository.saveAndFlush(user)

My best guess is, it will make your entity detached and as per the JPA documentation, it states an EntityExistsException is thrown by the persist method when the object passed in is a detached entity. Or any other PersistenceException when the persistence context is flushed or the transaction is committed.

Hibernate's persist(), save(), merge() and update , Next, let's create a JPA repository for the CRUD operations on the Employee entity class: ? 1. 2. public interface EmployeeRepository  In this tutorial, we will learn how to use save(), findById(), findAll(), and deleteById() methods of JpaRepository (Spring data JPA) with Spring Boot. As we know that Spring is a popular Java application framework. Spring Boot is an effort to create stand-alone, production-grade Spring-based applications with minimal effort.

One can perhaps use existsById(ID primaryKey) to test it, if userRepository extends CrudRepository:

if(userRepository.existsById(username)){
    //Throw your Exception
} else {
    this.userRepository.save(user);
}

see https://docs.spring.io/spring-data/jpa/docs/current/reference/html/

Difference between save vs persist and saveOrUpdate in Hibernate, accountRepository.save(account);. After we execute this update, we can verify the generated SQL statement. The generated SQL statement will  Using this element looks up Spring Data repositories as described in Section 1.2.3, “Creating repository instances”.Beyond that it activates persistence exception translation for all beans annotated with @Repository to let exceptions being thrown by the JPA persistence providers be converted into Spring's DataAccessException hierarchy.

Difference Between save() and saveAndFlush() in Spring Data JPA , Learn how the JPA persist and merge as well as the Hibernate save, update and Now let's see how we can persist and update an entity using JPA and Hibernate. setTitle( "High-Performance Java Persistence" ) To prevent this, you can use the @SelectBeforeUpdate Hibernate annotation which will  SaveOrUpdate() calls either save() or update() on the basis of identifier exists or not. e.g if identifier does not exist, save() will be called or else update() will be called. Probably you will get very few chances to actually call save() or saveOrUpdate() methods, as hibernate manages all changes done in persistent objects.

@DynamicUpdate with Spring Data JPA, Learn about usage of hibernate save() and saveOrUpdate() methods and how to which is useful in case you have mapped multiple entities to a Java class. load the entity from the session and update the entity with by copying VO data onto it. in catch block( mean get the index number where it stop and start again​). Create Spring Boot Project On the Eclipse, create a Spring Boot project Enter Project Information: Name: LearnSpringBootWithRealApps Group: com.demo Artifact: LearnSpringBootWithRealApps Description: Learn Spring Boot with Real Apps Package: com.demo Select the technologies and libraries to be used: JPA MySQL Click Next button to show Site Information for project Click Finish button to finish

How do JPA persist, merge and Hibernate save, update , This chapter includes details of the JPA repository implementation. If the entity has not been persisted yet Spring Data JPA will save the entity via a call to This will trigger the query annotated to the method as updating query instead of a of JPA QueryHint annotations plus a boolean flag to potentially disable the hints  CrudRepository is a Spring Data interface for generic CRUD operations on a repository of a specific type. It provides several methods out of the box for interacting with a database. In this tutorial, we'll explain how and when to use the CrudRepository save() method.

Comments
  • If it is updating the value instead of making a new insertion, it means it thinks it is the same object, but with updated values, are you reusing the object to make several insertions? what flush mode are you using?
  • I'm not reusing the same object, I edited the text so you can see the full method. How can I check my flush mode? I think it's the Spring Boot default, I didn't set anything about it.