I am using Spring boot 2.0.3.RELEASE(FINCHLEY)
`starter-data-jpa 2.0.5.RELEASE.
The scenario is pretty basic, build an entity and save it.
Let's go through the code for better context before we go through texts.
Entity class (Asset)
: The id(primary key) does not generate automatically because we basically get a unique UUID.toString()
from another source which is assuredly unique.
import lombok.*;
import org.springframework.data.domain.Persistable;
import javax.persistence.*;
import java.util.List;
@Setter
@Getter
@ToString
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "ASSET", schema = "SCHEMA")
public class Asset implements Persistable<String> {
// Propriety code hence column names removed.
//Let's just assume column names are fine, since when I am doing a find(), results are cool
private static final long serialVersionUID = 1L;
@Id
private String id;
private String creditPool;
private int quantity;
private int assetStatusTypeId;
private long assetTypeId;
private int ageOfAsset;
//The below snippet is part of Persistable<String> to force a new entry. Newly added following an answer in stackoverflow.
//Here, update is basically false by default,
//so as you can see isNew() will always return true forcing jpa to save a new record
@Transient
private boolean update;
@Override
public String getId() {
return this.id;
}
@Override
public boolean isNew() {
return !this.update;
}
}
As per the comments I have added, you see I added that snippet because we are not autogenerating the id
.
Without the snippet and Persistable the issue is same btw.
My custom repository class has the below custom save function because of business reasons.
@Override
public <S extends T> S save(S entity, long value) {
entity.someParams(args getting from from a jar) //which is really fine
return super.save(entity);
}
Code from which save
is being called is below
Asset asset = Asset.builder()
.id(UUID.randomId().toString()) //see always unique
.assetStatusTypeId(a valid id)
.assetTypeId(a valid id)
.creditPool("pool")
.quantity(integer value)
.ageOfAsset(integer value).build();
repo.save(asset);
I have verified the builder mutiple times and, It indeed creates a Asset
object without fail.
But the culprit save
never gets executed.
I have turned on the showSQL:true
to check whether the insert query gets called or not. But I see no such queries.
Hibernate properties:
jpa:
show-sql: true
properties:
hibernate:
enable_lazy_load_no_trans: true
show_sql: true
format_sql: true
jdbc:
batch_size: 5
I considered a scenario where even with all the safe checks, JPA might be treating it as a update scenario,
I ignored the save and used persist
as well. Even then no insertion.
repo.persist(asset);
Please help on this.
stackoverflow Sources for my workarounds and the duplicates. Any help on this would be very much appreciated.