How to Update an Entity Using Spring-Data-Jpa

How do I update an entity using spring-data-jpa?

Identity of entities is defined by their primary keys. Since firstname and lastname are not parts of the primary key, you cannot tell JPA to treat Users with the same firstnames and lastnames as equal if they have different userIds.

So, if you want to update a User identified by its firstname and lastname, you need to find that User by a query, and then change appropriate fields of the object your found. These changes will be flushed to the database automatically at the end of transaction, so that you don't need to do anything to save these changes explicitly.

EDIT:

Perhaps I should elaborate on overall semantics of JPA. There are two main approaches to design of persistence APIs:

  • insert/update approach. When you need to modify the database you should call methods of persistence API explicitly: you call insert to insert an object, or update to save new state of the object to the database.

  • Unit of Work approach. In this case you have a set of objects managed by persistence library. All changes you make to these objects will be flushed to the database automatically at the end of Unit of Work (i.e. at the end of the current transaction in typical case). When you need to insert new record to the database, you make the corresponding object managed. Managed objects are identified by their primary keys, so that if you make an object with predefined primary key managed, it will be associated with the database record of the same id, and state of this object will be propagated to that record automatically.

JPA follows the latter approach. save() in Spring Data JPA is backed by merge() in plain JPA, therefore it makes your entity managed as described above. It means that calling save() on an object with predefined id will update the corresponding database record rather than insert a new one, and also explains why save() is not called create().

How to beautifully update a JPA entity in Spring Data?

Even better then @Tanjim Rahman answer you can using Spring Data JPA use the method T getOne(ID id)

Customer customerToUpdate = customerRepository.getOne(id);
customerToUpdate.setName(customerDto.getName);
customerRepository.save(customerToUpdate);

Is's better because getOne(ID id) gets you only a reference (proxy) object and does not fetch it from the DB. On this reference you can set what you want and on save() it will do just an SQL UPDATE statement like you expect it. In comparsion when you call find() like in @Tanjim Rahmans answer spring data JPA will do an SQL SELECT to physically fetch the entity from the DB, which you dont need, when you are just updating.

Best way to save and update entity Parent and child using spring data jpa

I think is helped some one. please follow Vlad blog. He explain why we need to add Version to avoid a multiple Select. https://vladmihalcea.com/jpa-persist-and-merge/

So in my case I add somethink like this in my child entity:

    @Version
private Long version;

Update associated object inside Entity via @Query in spring data jpa

The following will update all Person entities' address.

@Transactional
@Modifying
@Query("update Person p set p.address = :address")
void update(@Param(value = "address") Address address)

Note the @Transactional annotation and make sure that the Address address parameter should not be transient, i.e. should already exist in database and fetch it from there

i.e.

Address address = new Address();
address.setState("blabla");
Address savedAddress = addressRepository.save(address);

personRepository.update(savedAddress); // use the peristed Address entity here.

Spring boot/Spring data jpa - how to update related entity?

As per your JSON structure. Yes it will create new profileContacts entry for every time.

The problem every time while saving profile entity you are passing "id": 1 that means Hibernate can identify the entity by this id value (primary key) but for profileContacts mapping you are not sending the id that's why Hibernate considering it has a new entity every time.

To update your profileContacts entity make sure to pass the id of it.

Example:

{ 
"id": 1,
"description": "an update",
"profileContacts": {
"id" : yourEntityId
"firstName": "John",
"lastName": "Doe"
}
}

Spring Data JPA - JPQL update query - printing out unupdated value

According to the JPA’s entity lifecycle states save() method may not write your changes to database immediately.

Since we use @Modifying in update query, this triggers the query annotated to the method as an updating query instead of a selecting one.

Reason for above issue is, when we save(), the persistence context of this with outdated entities may still there after the execution of the modifying query. EntityManager do not automatically clear it. If you wish the EntityManager to be cleared/flushed automatically, you can set the @Modifying annotation’s clearAutomatically and flushAutomatically attribute to true. Check this official doc Modifying Queries.

Annotation Type Modifying

clearAutomatically(true/false) - Defines whether we should clear the underlying persistence context after executing the modifying query. (Default -false)

flushAutomatically(true/false) - Defines whether we should flush the underlying persistence context before executing the modifying query. (Default -false)

Add this @Modifying(clearAutomatically = true, flushAutomatically = true) to the updateFirstNameByLastName method as below.

@Modifying(clearAutomatically = true, flushAutomatically = true)
@Transactional
@Query("update Student s set s.firstName = ?1 where s.lastName= ?2")
public void updateFirstNameByLastName(String firstName, String lastName)

Spring-Data-JPA Hibernate: how to override/update a detached entity with the same ID?

Hibernate already does select by id before saving detached entity. But the problem is that hibernate can't find entity by uuid. I don't know exactly how it works (it is possible that the problem is in the DBMS), but you can fix it by adding @Type annotation:

@Entity
public class Container {
@Id
@Type(type = "uuid-char")
private UUID id;
}


Related Topics



Leave a reply



Submit