Spring Data force version and lastmodified date to update on JPA Entity

Spring data has a feature that allows you to track automatically a certain amount of fields through annotations :

  • @CreatedDate : The date on which the entity was created
  • @CreatedBy : The user that created the entity
  • @LastModifiedDate : The date the entity was last modified
  • @LastModifiedBy : The user that modified last the entity
  • @Version : the version of the entity (increased each time the entity is modified and savesd)

Let's say for example we have this simple entity with the appropriate annotations :

entity
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
@Entity
@EntityListeners(AuditingEntityListener.class)
public class Contact implements Serializable {
 
    private static final long serialVersionUID = 1L;
 
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
 
    @Version()
    private Long version = 0L;
 
    @NotNull
    @CreatedDate
    private Date creationDate;
 
    @NotNull
    @Size(max = 50)
    @CreatedBy
    private String creationUserLogin;
 
    @NotNull
    @LastModifiedDate
    private Date modificationDate;
 
    @NotNull
    @Size(max = 50)
    @LastModifiedBy
    private String modificationUserLogin;
 
   private String firstName;
 
   private String lastName;
 
 //GETTERS - SETTERS and other code
    
 
}

And we're using the following service class and repository :

Service class
1
2
3
4
5
6
7
8
9
10
11
12
@Service
public class ContactServiceImpl implements ContactService{
 
   @Autowired
   private ContactRepository contactRepository;
 
 
  public Contact save(Contact contact){
    
    return contactRepository.save(entity);
  }
}
Repository class class
1
2
3
public interface ContactRepository extends JpaRepository<Contact, Long> {
 
}

Now whenever you change the value of one of the fields in the entity; the fields marked with @Version, @LastModified and @LastModifiedBy will be updated with new values automatically.

Now recently I had the case where I had to "touch" an entity (like in linux) so that the version will be increased as well as @LastModified and @LastModifiedBy will be updated accordingly even though none of the fields had been updated

Now you cannot update the automatically handled fields manually, but there is a way you can achieve this by using Spring's AuditingHandler; so we could modify our service class as follows :

Service class
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Service
public class ContactServiceImpl implements ContactService{
 
    @Autowired
    private ContactRepository contactRepository;
 
    @Autowired
    private AuditingHandler auditingHandler;
 
    
    public Contact save(Contact contact, boolean forceVersionIncrease){
         //force version update even though no values have changed in the entity
         if(forceVersionIncrease){
             auditingHandler.markModified(contact);
         }
    
     return contactRepository.save(entity);
   }
}

And there you go, you should be able now to "touch" your entities and force date and version updates

1 comment:

OSX show used ports or listening applications with their PID

On OSX you can display applications listening on a given port using the lsof the commands described below will show listening application...